Я задал аналогичный вопрос, который был отмечен как дубликат здесь: Рекомендуемый шаблон для наблюдения изменений структуры дерева [duplicate]
Я хотел избежать использования NSTreeController, поскольку это означает, что вы потерять управление анимацией при появлении обновлений.
У меня установлен MVVM. Моя модель представляет собой график, моя модель представления - это дерево. Между любыми узлами дерева и узлом графа существует одно отношение. Как подробно описано выше, между узлами дерева и контурным представлением очевидно много отношений.
Итак, я установил ...
Модель просмотра узлы дерева должны знать, когда их дети обновлены, поэтому я использовал KVO связанного узла графа, чтобы поймать, когда дочерние элементы добавлены или удалены.
Для обновления внешнего вида я остановился на делегате модели представления, который Я реализую на контроллере view. Каждый древовидный узел в модели представления может вызвать методы делегирования в корне дерева при добавлении или удалении дочерних элементов. Это чувствовало самый ясный подход ко мне и легко отлаживаемое. Я не хотел, чтобы цепочки происходили за кулисами.
Окончательный вызов обновления на основе внешнего вида чувствовал себя достаточно простым:
func itemsInserted(atIndexes indexes: IndexSet, forParent parent: ECViewModelNode) {
outlineView?.insertItems(at: indexes, inParent: parent, withAnimation: .slideDown)
}
На уровне ячеек таблицы я связываю непосредственно к деталям узлов модели графа.