Вопрос

У меня проблемы с отображением содержимого одного 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, возможно?) Без отправки соответствующих уведомлений об изменениях.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top