Использование одного NSArrayController из нескольких XIB - PullRequest
3 голосов
/ 17 января 2009

У меня проблемы с отображением содержимого одного NSArrayController в двух окнах, определенных в разных XIB.

В моем главном окне (в MainMenu.xib) у меня есть NSTableView, который привязан к NSArrayController

Во втором XIB у меня есть другое окно, которое содержит NSTableView. Я создал новый NSArrayController и привязал таблицу к содержимому этого NSArrayController.

Оба NSArrayControllers привязаны к одному и тому же NSArray.

Сначала все в порядке, но проблема в том, что если объект добавляется в массив с помощью NSArrayController в главном окне, представление данных вторичного окна не обновляется. Это наиболее вероятно, потому что он не знает, что ему нужно обновить себя, так как его NSArrayController не использовался для добавления нового объекта.

Что я хотел бы сделать, это использовать один и тот же экземпляр NSArrayController в обоих окнах. Таким образом, если объект добавлен в массив, оба представления будут уведомлены об изменении.

Проблема в том, что я не могу понять, как это сделать в Интерфейсном Разработчике. Я не могу связать NSArrayController с другим NSArrayController (я получаю ошибку времени выполнения, указывающую, что он может быть привязан только к NSArray). Подключение NSArrayController к NSArrayController члену Владельца Файла также не поможет, так как это просто уничтожит NSArrayController, который я хочу использовать.

Полагаю, я мог бы сам устанавливать привязки в коде, но, по-видимому, было бы лучше использовать Interface Builder, если это возможно. Есть ли способ сделать это в Интерфейсном Разработчике, или, может быть, лучший способ настроить это все вместе?

Обновление: В ответ на ответ и комментарии Чака я попробовал следующее: -Привязать содержимое таблицы моего NSTableView к вещественным организациям объекта NSArrayController (если я использовал сам NSArrayController, в журнале появилась ошибка: «[NSArrayController count]: нераспознанный селектор отправлен в экземпляр») -Связать каждый столбец в таблице с владельцем файла, указав путь к ключу модели arrayController.arrangedObjects.propertyName

Это все равно не привело к обновлению содержимого таблицы. Я думаю, что это связано с тем, что я привязываю не к самому объекту NSArrayController аранжированные объекты объекта NSArrayController. Но если я связываюсь с NSArrayController напрямую, это дает мне ошибки.

Обычно я выбираю свой NSArrayController из ComboBox «Привязать к», использую layoutObjects в качестве ключа контроллера, а само свойство в качестве пути ключа модели. Я не уверен, как сделать эквивалент этого в этом случае - если я могу вообще.

Я что-то не так сделал в вышеуказанном процессе?

Ответы [ 4 ]

1 голос
/ 01 июля 2009

Вы можете заставить оба NSArrayControllers обновляться через KVO при добавлении массива в. Хитрость в том, что вы должны наблюдать и добавлять в массив способ, совместимый с KVO.

Вам нужен объект, которому принадлежит массив, назовем его «модель». Массив должен быть ключом объекта, давайте назовем ключ "contentArray". Затем, когда вы добавляете / удаляете из, вы должны сделать это, сначала вызвав mutableArrayForKey для «model», чтобы получить «contentArray». Тогда добавление / удаление из массива должно работать, например:

Controller1 связан с self.model.contentArray

Controller2 связан с self.model.contentArray

//this method is on the "model" object
-(void)addContent(id content)
{
    NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"];
    [contentArr addObject:content]; //this will trigger KVO notifications
}

В качестве альтернативы вы можете сделать уведомления KVO вручную следующим образом:

-(void)addContent(id content)
{
    [self willChangeValueForKey:@"contentArray"];
    [m_contentArray addObject:content];
    [self didChangeValueForKey:@"contentArray"];
}
1 голос
/ 27 января 2009

Лучший вариант, который мне удалось придумать, - уведомить вторую NSArrayController, что массив, которым он управляет, изменился, вызвав rearrangeObjects:. Это кажется неуклюжим, но это работает.

1 голос
/ 27 января 2009

А как насчет того, чтобы установить их в качестве прокси-объектов в IB, а затем создать экземпляр фактического кода, возможно, в делегате приложения?

0 голосов
/ 19 января 2009

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

...