Обновите столбцы таблицы, привязанные к NSArrayController - PullRequest
1 голос
/ 19 апреля 2010

Я довольно новичок в мире привязок в какао, и у меня возникли некоторые проблемы (возможно / вероятно из-за недопонимания).

У меня есть синглтон, который содержит NSMutableArray, называемый плагинами, содержащий объекты класса Plugin. У него есть метод loadPlugins, который добавляет объекты в массив плагинов. Это можно назвать в любой момент. Он был добавлен в качестве экземпляра в Интерфейсном Разработчике.

Также в IB есть NSObjectController, выход содержимого которого подключен к синглтону. Существует также NSArrayController, чей contentArray связан с NSObjectController (ключ контроллера - это «выбор», путь к ключу модели - «плагины», имя класса объекта - «Плагин»).

И, наконец, у меня есть табличное представление с 2 столбцами, значения которых привязаны к стандартным объектам NSArrayController с использованием ключей свойств в классе Plugin.

Пока что стандарт (насколько я могу судить по учебникам). Моя проблема в том, что когда метод loadPlugins вызывается в синглтоне и объекты добавляются в массив плагинов, таблица не обновляется, чтобы показать объекты (если только loadPlugins не вызывается до загрузки пера). -reloadData, вызываемый для tableView, ничего не делает.

Есть ли способ сообщить NSArrayController, что указанный массив обновлен? Я понимаю, что есть метод -add: для NSArrayController, который можно использовать в loadPlugins, но это нежелательно, так как я хочу сохранить синглтон полностью отделенным от аспекта отображения.

Это, похоже, связано с: Обновить привязку какао - NSArrayController - ComboBox

Строка: «редактирование массива за спиной контроллера», возможно, возможно, указывает на проблему, но я надеюсь, что синглтон не сможет знать о контроллере.

Заранее спасибо.

\ редактировать ...

Согласно предложению TechZen, вот привязки:

TableColumn --('arrangedObjects', 'pluginName', Value)--> NSArrayController
NSArrayController --('selection', 'plugins', ContentArray)--> NSObjectController
NSObjectController --(content)--> PluginsManager

Ответы [ 3 ]

5 голосов
/ 19 апреля 2010

Как хакерский способ заставить его работать (вызывая соответствующее уведомление KVO), попробуйте ввести:

[self willChangeValueForKey:@"plugins"];
[plugins addObject:somePlugin];
[self didChangeValueForKey:@"plugins"];

Вместо

[plugins addObject:somePlugin];

В идеале вы должны реализовать полную поддержку KVC, тогда вы можете использовать KVC для запуска KVO, что вызовет обновление Bindings. Если вы сделали это, вы можете использовать:

[self insertObject:somePlugin inPluginsAtIndex:0];

Для получения информации о том, что требуется для соответствия KVC, прочитайте это: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/Concepts/Compliant.html.

2 голосов
/ 21 апреля 2010

Я понял это - это был классический случай RTFM Understand-TFM ). Все сводилось к , обеспечивающему соответствие KVC .

В Синглтоне PluginManager, в котором был массив под названием «плагины», мне просто нужно было реализовать:

-insertObject:inPluginsAtIndex:
-removeObjectFromPluginsAtIndex:

А затем используйте эти методы, когда я хотел добавить / удалить плагин.

Спасибо за помощь, ребята.

0 голосов
/ 19 апреля 2010

Есть ли способ рассказать NSArrayController, на который ссылается массив был обновлен?

Тебе не нужно было. Вот для чего нужно наблюдение за значением ключа. Это основа всей обязательной функциональности. Связанный объект (в данном случае элемент интерфейса) автоматически наблюдает (получает уведомление), что объект, который он наблюдает, изменился. Вы никогда не должны вручную сообщать ему, что изменение произошло. Если таблица не обновляется, то привязка неверна.

Трудно сказать по текстовому описанию, но я думаю, что ваша проблема в том, что у вас NSObjectController установлен в "selection". Это будет работать, только если вы связали другой элемент пользовательского интерфейса с NSObjectController, и этот элемент выбирает элемент данных в контроллере.

Вы можете попробовать записать привязки примерно так:

Object1--(controller key, key path, class)--> Object2 
Object2--(controller key, key path, class)--> Object3

Возможно, вы видите проблему, и если вы опубликуете ее, остальные из нас могут ее понять.

(Должен существовать стандарт для текстового представления привязок и взаимосвязей базовых данных, но я думаю, что мы разберемся.)

...