0

Если я изменил свой NSOutlineView с помощью привязок и NSTreeController на источник данных и делегат, как бы я автоматически обновил NSOutlineView, если меняет дерево моделей? Должен ли я наблюдать свойство childNodes каждого отдельного узла в моем дереве с моим контроллером и запускать перезагрузку при изменении? Или есть другой способ?Автоматическое обновление NSOutlineView при изменении модели без NSTreeController

ответ

1

Это один из способов. Другим способом было бы, чтобы модель отправила уведомления, когда она изменилась, и попросите своего наблюдателя наблюдать за ними.

Кроме того, модель обычно не изменяется спонтанно. Обычно изменение инициируется за пределами модели в ответ на какое-либо событие. Обычно это делает контроллер. Таким образом, этот контроллер также может спровоцировать обновление в виде схемы. (Может быть несколько контроллеров, поэтому, возможно, контроллер, который инициирует изменение модели, просто информирует контроллер окна или представления, который будет отвечать за обновление плана.)

+0

В моем случае возможно, что модель сама изменится (узел добавляет или удаляет из себя детей) на основе определенных событий, не связанных с взаимодействием с пользователем. Я подумаю об использовании глобальных уведомлений, спасибо! – DrummerB

0

Я задал аналогичный вопрос, который был отмечен как дубликат здесь : Recommended Pattern for Observing Changes in Tree Structure [duplicate]

Я хотел избежать использования NSTreeController, поскольку это означает, что вы теряете контроль над анимациями при возникновении обновлений.

У меня установлен MVVM. Моя модель представляет собой график, моя модель представления - это дерево. Между любыми узлами дерева и узлом графа существует одно отношение. Как подробно описано выше, очевидно, что существует много отношений между узлами дерева и контурным представлением.

Итак, я поселился с ...

Вид-модель узлы дерева должна знать, когда их дети будут обновлены, поэтому я использовал КВО связанного узла графа, чтобы поймать, когда дети будут добавлены или удалены.

Для обновления плана я остановился на делегате модели, который я реализую на контроллере представления. Каждый древовидный узел в модели представления может вызвать методы делегирования в корне дерева при добавлении или удалении дочерних элементов. Это чувствовало самый ясный подход ко мне и легко отлаживаемое. Я не хотел, чтобы цепочки происходили за кулисами.

Окончательный вид очертание обновление вызова чувствовал удовольствию просто:

func itemsInserted(atIndexes indexes: IndexSet, forParent parent: ECViewModelNode) { 
     outlineView?.insertItems(at: indexes, inParent: parent, withAnimation: .slideDown) 
    } 

На уровне таблицы клеток ракурса я связываться непосредственно к деталям графа модели узлов.