Значение ключа Наблюдение с помощью NSArray

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

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

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

РЕДАКТИРОВАТЬ : iOS SDK даже поддерживает NSArrayController ? Если нет, есть ли другой способ?

21
задан von v. 24 April 2013 в 02:15
поделиться

1 ответ

Вам не нужен 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. К счастью, он вам не нужен.

31
ответ дан 29 November 2019 в 21:21
поделиться