Coo*_*coa 10 cocoa objective-c key-value-observing
我在布尔属性上使用键值观察NSObject方法:
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
Run Code Online (Sandbox Code Playgroud)
这个关键路径的值最有趣的部分是BOOL,它在YES/NO之间不断翻转.我从更改字典中获得的最多是kind = 1.无论如何没有探测我正在观察的对象,看看实际的变化值是什么?
谢谢.
Jim*_*vey 21
首先,指定NSKeyValueObservingOptionNew:
[theObject addObserver: self
forKeyPath: @"theKey"
options: NSKeyValueObservingOptionNew
context: NULL];
Run Code Online (Sandbox Code Playgroud)
......然后,在你的观察者方法中:
-(void) observeValueForKeyPath: (NSString *)keyPath ofObject: (id) object
change: (NSDictionary *) change context: (void *) context
{
BOOL newValue = [[change objectForKey: NSKeyValueChangeNewKey] boolValue];
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,您可以在调用之前检查值是否nil(好吧,可能会发生)-boolValue,但为了清楚起见,这里省略了.
Eli*_*oij 20
正如Jim Dovey所说,除了改变字典没有带来nil,而是null值,所以
NSLog(@"%@", [change description]);
Run Code Online (Sandbox Code Playgroud)
将导致类似于:
{
kind = 1;
new = <null>;
old = <null>;
}
Run Code Online (Sandbox Code Playgroud)
如上所述,在空值上调用boolValue将导致错误
[NSNull boolValue]:无法识别的选择器发送到实例0xa0147020
要避免这种情况,必须检查nil是否为[NSNull null],如下所示:
if([change objectForKey:NSKeyValueChangeNewKey] != [NSNull null])
BOOL newValue = [[change objectForKey: NSKeyValueChangeNewKey] boolValue];
Run Code Online (Sandbox Code Playgroud)
要么
id newValue;
if((newValue[change valueForKey: @"new"]) != [NSNull null]){
BOOL newBOOL = [newValue boolValue];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12057 次 |
| 最近记录: |