Вопрос

в своем приложении я сделал очень простую привязку.У меня есть NSMutableArray, привязанный к NSArrayController.Сам контроллер привязан к выпадающему списку, и он показывает все содержимое NSMutableArray.Работает нормально.

Проблема в том, что :Содержимое Массива изменится.Если пользователь вносит некоторые коррективы в приложение, я удаляю все элементы в NSMuteableArray и заполняю его новыми и отличающимися элементами.

Но привязка NSMutableArray <-> NSArrayController <-> NSComboBox не обновляется.

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

Что здесь не так?Мой подход неверен или мне нужно только указать привязке обновить саму себя?Я не знал, как это сделать.

Это было полезно?

Решение

Скорее всего, вы "редактируете массив за спиной контроллера", что подрывает механизм KVO.

Ты сказал:

У меня есть NSMutableArray, привязанный к NSArrayController.

Каким образом?Где находится массив?В документе, доступном через KVC/KVO -совместимый -myArray / -setMyArray:набор средств доступа?

Держу пари, вы напрямую указываете ivar "myArray" на -removeAllObjects, верно?Как эти средства доступа KVC / KVO "узнают", что массив изменился?

Ответ в том, что они этого не делают.Если вы действительно заменяете весь массив, вы захотите указать своему документу (или тому, кому принадлежит массив) значение -setMyArray:к совершенно новому массиву данных.Это вызовет соответствующие вызовы KVO.

...но тогда вам на самом деле не нужен изменяемый массив, не так ли?Если вы хотите заменить только отдельные элементы в массиве, вам нужно будет использовать индексированные средства доступа:

(Документация - смотрите раздел "Шаблоны доступа ко многим свойствам коллекции") http://tinyurl.com/yb2zkr5

Другие советы

Попробуйте это (используя ARC / OS X 10.7):

в заголовочном файле определите arrayInstance и arrayController

 @property (weak) IBOutlet NSArrayController *arrayController;
 @property (strong) NSArray *arrayInstance; // for the array instance

затем в реализации

 @synthesize arrayController = _arrayController;
 @synthesize arrayInstance = _arrayInstance;

 _arrayInstance = .......  // What ever the new array will be
 [_arrayController setContent:_arrayInstance];

Это заставит arrayController обновлять содержимое и корректно отображаться.

Другое решение, кроме двух строк кода, будет таким:

 [self willChangeValueForKey:@"arrayInstance"];
 _arrayInstance = .......  // What ever the new array will be
 [self didChangeValueForKey:@"arrayInstance"];

Думаю, что первое выглядит более очевидным, а второе более похожим на КВО.

Похоже, проблема заключается в соблюдении требований KVC / KVO.Вы должны создать новый массив и обновить ссылку новым объектом, используя сгенерированные методы доступа.В противном случае вы можете отправлять сообщения KVO об обновлении массива, чтобы информировать привязки о том, что содержимое массива изменилось.

Христианин

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