NSComboBox, привязанный к NSArrayController, не обновляется

У меня проблема с привязками между элементом NSComboBox и элементом NSArrayController.

Все привязки настроены в IB. Элемент NSComboBox имеет следующие привязки:

  • Содержимое: привязано к экземпляру NSArrayController, ключ: arrangedObjects
  • Значения содержимого: привязаны к экземпляру NSArrayController, ключ: arrangedObjects.name

Элемент NSArrayController связан следующим образом:

  • Массив содержимого: привязан к File's Owner, ключевой путь: availableProperties (который является NSMutableArray

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

Код следующий:

NSMutableArray* newAvailable = ...; //compute the new properties to be displayed. 

//now I want to replace all the properties with the new one
if ([self.availableProperties count] > 0)
    [self.availablePropertiesController removeObjects:self.availableProperties];
[self.availablePropertiesController addObjects:newAvailables];

где self.availableProperties — это NSMutableArray (модель), а self.availablePropertiesController — это NSArrayController

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

Некоторые идеи?


person Francesco    schedule 11.01.2014    source источник


Ответы (1)


Вы близки, вы должны просто сделать:

NSMutableArray* newAvailable = ...; //compute the new properties to be displayed. 
self.availableProperties = newAvailable;

Вы уже привязали arrayController к вашей переменной « availableProperties », поэтому все, что вам нужно сделать, чтобы изменить пользовательский интерфейс, — это изменить свою переменную. В этом прелесть креплений.

Кроме того, ваши «доступные свойства», вероятно, должны быть NSArray, а не NSMutableArray, потому что, если вы случайно вставите объект в середину NSMutableArray, привязка arrayController не заметит — она заметит только тогда, когда все «доступные свойства» переменная экземпляра изменяется, а не тогда, когда что-то внутри нее мутирует.

person Wil Shipley    schedule 11.01.2014
comment
Я попробовал это, и это не работает, как я ожидал. Прежде всего, вы можете привязаться к изменяемой коллекции. Вам просто нужно не забыть либо изменить его только через контроллер, либо убедиться, что ваш класс соответствует кодированию значения ключа для изменяемых отношений ко многим. В моем случае я решил использовать контроллер, но я также пытался редактировать непосредственно коллекцию, и это не сработало. Кстати, как я уже писал, изменение контроллера меняет мою переменную массива, просто он не обновляет пользовательский интерфейс - person Francesco; 11.01.2014