21

Я посмотрел на SO Примеры использования ключа Значение Соблюдая с NSArray (или NSMutableArray) и, видимо, вам нужно использовать NSArrayController (который, в отличие KVO я не знаком с), но Я не нашел конкретных примеров того, как это сделать. Может ли кто-нибудь объяснить пример кода?Key Value Соблюдая с NSArray

Например, если у меня есть GameModel, который представляет его имена игроков с NSArray (playerNameArray)NSStrings. Я хочу наблюдать эти строки (контроллер просмотра наблюдает за данными модели), чтобы обновлять различные вещи в представлении.

Как получить уведомление о том, что массив имен игрока изменился?

EDIT: Поддерживает ли SDK iOS NSArrayController? Если нет, есть ли другой способ?

ответ

30

Вам не нужен NSArrayController для наблюдения за изменениями в NSArray. Однако вы не можете напрямую наблюдать за этими изменениями, т. Е. Вы не можете позвонить -addObserver:forKeyPath:options:context: непосредственно на NSArray. В вашем случае вы хотите назвать это на своем GameModel с @"playerNameArray" в качестве ключа.

Вы еще не закончили. Обычные автоматические уведомления KVO будут срабатывать только в том случае, если вы вызываете -setPlayerNameArray:, тем самым заменяя весь массив. Если вы хотите получить более подробные уведомления, вам необходимо использовать -willChange:valuesAtIndexes:forKey: и -didChange:valuesAtIndexes:forKey: всякий раз, когда вы вставляете, удаляете или заменяете элементы в этом массиве.

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

Примечание: NSArrayController не существует на iOS. Это часть Cocoa Bindings, которая в настоящее время существует только в AppKit в Mac OS X. К счастью, вам это не нужно.

+0

Я попытался точно установить эту настройку на iOS-4, и ничего не произошло (оба обратных вызова реализованы с помощью автозаполнения Xcode, поэтому я уверен, что они правильно введены. Я проверил все объекты, не имеющие нулевого значения, все снова проверено с помощью контрольные точки). Apple удалила его? – Adam

+0

Они не являются обратными вызовами - вам нужно позвонить им, чтобы регулярно использовать KVO в коллекции. –

+4

@ Адам, что он говорит, заключается в том, что вам нужно написать свои собственные аксессуры для NSMutableArray и самостоятельно записать записи KVO. – jpswain