Использование одного NSArrayController из нескольких XIB
-
19-08-2019 - |
Вопрос
У меня проблемы с отображением содержимого одного 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, в журнале появилась ошибка: & Quot; [NSArrayController count]: нераспознанный селектор, отправленный экземпляру & Quot; ) -Связать каждый столбец в таблице с владельцем файла, указав путь к ключу модели arrayController.arrangedObjects.propertyName
Это все равно не привело к обновлению содержимого таблицы. Я думаю, что это связано с тем, что я привязываю не к самому объекту NSArrayController аранжированные объекты объекта NSArrayController. Но если я связываюсь с NSArrayController напрямую, это дает мне ошибки.
Обычно я выбираю свой NSArrayController из " Bind to " ComboBox, используйте органообъекты в качестве ключа контроллера, а само свойство в качестве пути ключа модели. Я не уверен, как сделать эквивалент этого в этом случае - если я могу вообще.
Я сделал что-то не так в процессе выше?
Решение
Лучший вариант, который я смог придумать, - уведомить второе NSArrayController
, что массив, которым он управляет, изменился, вызвав для него rearrangeObjects:
. Это кажется неуклюжим, но это работает.
Другие советы
Как насчет того, чтобы настроить их в качестве прокси-объектов в IB, а затем создать экземпляр фактического кода, возможно, в делегате приложения?
Вы можете заставить оба NSArrayControllers обновляться через KVO при добавлении массива в. Хитрость заключается в том, что вы должны наблюдать и добавлять в массив способ, совместимый с KVO.
Вы хотите, чтобы какой-то объект имел массив, назовем его " model " ;. Массив должен быть ключом объекта, давайте назовем ключ & Quot; contentArray & Quot ;. Затем, когда вы добавляете / удаляете из, вы должны сделать это, сначала вызвав mutableArrayForKey для & Quot; model & Quot; получить " 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"];
}
Нет никаких причин, по которым два контроллера массива должны заставлять одно представление не обновляться при обновлении через другое. Если этого не происходит, похоже, что ваши уведомления KVO где-то теряются. Скорее всего, вы непосредственно редактируете массив (в методе add:
подкласса NSArrayController, возможно?) Без отправки соответствующих уведомлений об изменениях.