Привязка NSTableView к NSArrayController вместо извлечения данных непосредственно из массива моей модели - PullRequest
0 голосов
/ 06 февраля 2012

Текущая ситуация: прямая привязка

У меня есть NSTableView, который отображает данные, полученные из NSArray моих пользовательских объектов.

Требуемый подход: контроллер массива

Тем не менее, было бы "лучшей практикой" использовать NSArrayController вместо этого как фасад моего произвольного объекта модели.

Итак, я продублировал таблицу в своем приложении и создал новый NSViewController, где я связал Table Content из NSTableView с NSArrayController. Я добавил IBOutlet для этого класса, чтобы теперь я мог настроить свой View Controller следующим образом:

ContactListViewController *myVC = [[ContactListViewController alloc] init];

// Tell the ArrayController where the content-array is.
myVC.contactsArrayController.content = self.myModel.contactsArray;

Теперь, поскольку я связал Table Content табличного представления с контроллером массива, я ожидал, что, как только я заполню массив данными (из удаленного сервиса), обновится табличное представление, что имеет место для другого моего подхода, где я связываюсь с myModel.contactsArray напрямую.

Проблема: нет данных

Однако таблица остается пустой. Должен ли я настроить что-то еще, чтобы это работало (Может быть, какой-то willChangeValueForKey -магический или что-то еще, что я пропустил. Я уже пытался установить контроллер массива как dataSource и delegate NSTableView, но это тоже не сработало (во всяком случае, мне не ясно, как dataSource и Table Content привязка "связаны друг с другом").

1 Ответ

2 голосов
/ 09 февраля 2012

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

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

Вместо этого:

  1. Вызов -add: на контроллере массивакогда вы вставляете контент.Это, вероятно, не поможет в вашем случае.

  2. Если вы используете неизменяемые массивы, вы можете связать контроллер массива с ключом myModel contactsArrayвместо того, чтобы назначать его.

  3. Если вы используете изменяемый массив, я не думаю, что это будет работать.Вы можете создать второй контроллер массива в модели и привязать контроллер массива представления к contactsArrayController.arrangedObjects.Может быть, есть лучший способ, но это то, что я делал в прошлом.

...