Как программно контролировать объект KVC? - PullRequest
4 голосов
/ 09 июня 2011

Я пытаюсь отслеживать NSMutableArray на наличие изменений с помощью кода. Я хочу добавить наблюдателя для каждого изменения массива, но я не вижу, каким должно быть NotificationName, чтобы это произошло.

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

1 Ответ

5 голосов
/ 09 июня 2011

Я не на 100%, но я уверен, что Наблюдение значения ключа - это то, что вы хотите.

Какой бы объект ни заботился о массиве, он регистрируется как наблюдатель:

[objectWithArray addObserver:self 
                  forKeyPath:@"theArray"
                     options:NSKeyValueObservingOptionNew 
                     context:nil];

Затем он получит уведомление об изменении массива:

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context {

    NSLog(@"Change is good: %@", [change objectForKey:NSKeyValueChangeNewKey]);
}

Обратите внимание, что этот единственный метод будет собирать все наблюдения, для которых этот объект зарегистрирован. Если вы зарегистрируете один и тот же объект для наблюдения множества разных ключей, вам, вероятно, придется различать их при вызове этого метода; это цель аргументов keyPath и object.

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

[self willChangeValueForKey:@"theArray"];
[theArray addObject:...];
[self didChangeValueForKey:@"theArray"];

Произвольный каркасный класс будет иметь некоторые свойства, а некоторые свойства не совместимы с наблюдением значения ключа. Например, NSWindow s firstResponder соответствует KVO, но его childWindows нет. Документы, конечно, скажут вам, какие есть какие.

...