11

我在布尔属性上使用键值观察 NSObject 方法:

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

这个关键路径的值中最有趣的部分是一个 BOOL,它在 YES/NO 之间不断翻转。我从更改字典中得到的最多是 kind = 1。无论如何,如果不探测我正在观察的对象以查看实际的更改值是什么?

谢谢。

4

2 回答 2

23

首先,您指定 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];
}

理想情况下,您会在调用之前检查 value 是否nil(好吧,它可能会-boolValue发生) ,但为了清楚起见,这里省略了。

于 2009-05-11T21:42:24.373 回答
21

正如 Jim Dovey 所说,除了变化字典不带零值,而是空值,所以

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

将导致类似:

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

如前所述,对空值调用 boolValue 将导致错误

[NSNull boolValue]:无法识别的选择器发送到实例 0xa0147020

为避免这种情况,必须检查的不是 nil,而是 [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];
}
于 2009-06-30T13:48:34.820 回答