Если я изменил свой NSOutlineView с помощью привязок и NSTreeController на источник данных и делегат, как бы я автоматически обновил NSOutlineView, если меняет дерево моделей? Должен ли я наблюдать свойство childNodes каждого отдельного узла в моем дереве с моим контроллером и запускать перезагрузку при изменении? Или есть другой способ?Автоматическое обновление NSOutlineView при изменении модели без NSTreeController
ответ
Это один из способов. Другим способом было бы, чтобы модель отправила уведомления, когда она изменилась, и попросите своего наблюдателя наблюдать за ними.
Кроме того, модель обычно не изменяется спонтанно. Обычно изменение инициируется за пределами модели в ответ на какое-либо событие. Обычно это делает контроллер. Таким образом, этот контроллер также может спровоцировать обновление в виде схемы. (Может быть несколько контроллеров, поэтому, возможно, контроллер, который инициирует изменение модели, просто информирует контроллер окна или представления, который будет отвечать за обновление плана.)
Я задал аналогичный вопрос, который был отмечен как дубликат здесь : 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)
}
На уровне таблицы клеток ракурса я связываться непосредственно к деталям графа модели узлов.
В моем случае возможно, что модель сама изменится (узел добавляет или удаляет из себя детей) на основе определенных событий, не связанных с взаимодействием с пользователем. Я подумаю об использовании глобальных уведомлений, спасибо! – DrummerB