2012-03-30 1 views
1

Я новичок в программировании Cocoa (но относительно опытный с другими инфраструктурами пользовательского интерфейса) и не могу точно сказать, где я ошибаюсь в в следующей ситуации.Как внести изменения в NSOutlineViewDataSource инициировать обновление других элементов

У меня есть «дерево» данных, которое обернуто NSOutlineViewDataSource. Элементы очень простые чтения/записи (думаю, флажки). Однако, когда

setObjectValue: (идентификатор) объекта forTableColumn: (NSTableColumn *) TableColumn byItem: (идентификатор) пункт

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

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

Что такое механизм наилучшей практики для выполнения чего-то подобного? Есть ли событие NSOutlineView, которое я должен прослушивать, чтобы вызвать обновление. Должен ли мой NSOutlineViewDataSource поднимать событие, которое прослушивает просмотр? Или мой основной подход совершенно неправильный?

(я на самом деле делать это с Monomac, но я думаю, что любой ответ относится к какао в целом)

ответ

1

Андрей - самый простой способ сделать это, чтобы посмотреть в программировании КВО. Если конкретный элемент, который вы хотите посмотреть, является совместимым с KVO, вы можете настроить наблюдателя на нем с помощью «addObserver». Затем вы реализуете функцию делегата «observValueForKeyPath» в классе наблюдателя и можете принудительно изменять пользовательский интерфейс, когда эта функция уведомляется изменения стоимости, которую вы смотрите. Не все совместимы с KVO, поэтому ваш пробег меня зависит от характера того, что вы хотите контролировать для изменений. Но если вы просматриваете свойство на пользовательском объекте, определенно будет хорошо использовать KVO.

KVO руководство по программированию здесь:

https://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html

+0

Так контроллер держит мой взгляд контура будет создан, чтобы быть наблюдателем для всех элементов данных? И тогда он может вызвать обновление и т. Д., Вызвав reloadData() в виде контура, если он сочтет это необходимым? –

+0

Да, это общая идея. Вы можете установить «addObserver» для себя, а затем убедитесь, что в этом контроллере реализована функция observValueForKeyPath. –