Значение ключа Наблюдение в Какао, самоанализ свойства изменения - PullRequest
10 голосов
/ 12 мая 2009

Я использую наблюдение значения ключа для логического свойства метода NSObject:

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

Наиболее интересной частью значения для этого ключевого пути является BOOL, который постоянно переключается между ДА / НЕТ. Самое большее, что я получаю из словаря изменений - это вид = 1. Есть ли вообще какой-либо объект, который я наблюдаю, чтобы узнать, каково действительное значение изменения?

Спасибо.

Ответы [ 2 ]

20 голосов
/ 12 мая 2009

Во-первых, вы указываете NSKeyValueObservingOptionNew:

[theObject addObserver: self
            forKeyPath: @"theKey"
               options: NSKeyValueObservingOptionNew
               context: NULL];

… затем, в вашем методе наблюдателя:

-(void) observeValueForKeyPath: (NSString *)keyPath ofObject: (id) object
                        change: (NSDictionary *) change context: (void *) context
{
    BOOL newValue = [[change objectForKey: NSKeyValueChangeNewKey] boolValue];
}

В идеале вы должны проверить, было ли значение nil (ну, может * могло бы произойти) перед вызовом -boolValue, но это было опущено для ясности здесь.

19 голосов
/ 30 июня 2009

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

NSLog(@"%@", [change description]); 

приведет к чему-то вроде:

{
    kind = 1;
    new = <null>;
    old = <null>;
}

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

[NSNull boolValue]: нераспознанный селектор отправлен на экземпляр 0xa0147020

Чтобы избежать этого, нужно проверять не на ноль, а на [NSNull null], вот так:

if([change objectForKey:NSKeyValueChangeNewKey] != [NSNull null]) 
  BOOL newValue = [[change objectForKey: NSKeyValueChangeNewKey] boolValue];

или

id newValue;
if((newValue[change valueForKey: @"new"]) != [NSNull null]){
     BOOL newBOOL = [newValue boolValue];
}
...