当前位置:  开发笔记 > 编程语言 > 正文

Cocoa中的关键价值观察,反思变化属性

如何解决《Cocoa中的关键价值观察,反思变化属性》经验,为你挑选了2个好方法。

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

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

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

谢谢.



1> Jim Dovey..:

首先,指定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,但为了清楚起见,这里省略了.



2> Elise van Lo..:

正如Jim Dovey所说,除了改变字典没有带来nil,而是null值,所以

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

将导致类似于:

{
    kind = 1;
    new = ;
    old = ;
}

如上所述,在空值上调用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];
}

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有