2010-04-19 2 views
1

Я довольно новичок в мире привязок в какао, и у меня возникают некоторые проблемы (возможно, вероятно, из-за недоразумений).Обновить столбцы таблицы, привязанные к NSArrayController

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

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

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

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

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

Это кажется связано с: Refresh Cocoa-Binding - NSArrayController - ComboBox

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

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

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

По предложению TechZen, вот это привязок:

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

ответ

5

В несколько Hacky способ получить его работы (путем активации соответствующего уведомления КВО) , попробуйте положить:

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

Вместо

[plugins addObject:somePlugin]; 

в идеале вы должны осуществить полный на поддержку КВЦ, то вы можете использовать KVC для запуска K VO, который инициирует обновление Bindings. Если вы сделали это, вы могли бы использовать:

[self insertObject:somePlugin inPluginsAtIndex:0]; 

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

0

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

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

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

Вы могли бы попытаться выписывая привязок что-то вроде:

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

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

(Там должно быть стандартом для представления привязок и отношения Core Data текстуально, но я предполагаю, что мы выкарабкаться.)

2

Я понял это - это был классический случай RTFMПонимать-TFM). Все опустилось до ensuring KVC compliance.

В PluginManager Singleton, который имел массив называется «плагинов», я просто необходимо реализовать:

-insertObject:inPluginsAtIndex: 
-removeObjectFromPluginsAtIndex: 

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

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

+0

Это было монументально полезно. Спасибо, что ответили на ваш собственный вопрос - для меня это был большой шаг. –

Смежные вопросы