KVO在bool属性上,不调用observeValueForKeyPath

时间:2013-02-14 09:19:52

标签: ios singleton key-value-observing key-value-coding

我有一个appDelegate,它有MyWindowClass的myWindow属性。我需要从myWindow观察bool属性。比我有一个CustomViewController,需要观察bool值的变化。 如果我想addObserver,我在ViewController中执行以下操作:

LayerWindow *w = ((AppDelegate*)[UIApplication sharedApplication].delegate).window;
    [w addObserver:self forKeyPath:@"touchInsideLayerWindow" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil];

在ViewController中我有

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

方法定义,也在头文件中。

在WindowClass中,我有以下代码:

[self setValue:[NSNumber numberWithBool: YES]forKey:@"touchInsideLayerWindow"];
 NSLog(@"isTouchInside %@", self.touchInsideLayerWindow ? @"YES" : @"NO");

从不调用ViewController中的方法observeValueForKeyPath。有谁知道,有什么不对? 感谢

3 个答案:

答案 0 :(得分:3)

看起来有一个问题是您说该属性是BOOL,但您尝试将其设置为NSNumber来电中的setValue

第二:如果你使用@synthesize创建你的setter,那么只要你使用点语法就会自动支持KVO。

   self.touchInsideLayerWindow = YES;

答案 1 :(得分:0)

将此行[self setValue:[NSNumber numberWithBool: YES]forKey:@"touchInsideLayerWindow"];替换为

[self willChangeValueForKey:@"touchInsideLayerWindow"];
[self setValue:[NSNumber numberWithBool: YES]forKey:@"touchInsideLayerWindow"];
[self didChangeValueForKey:@"touchInsideLayerWindow"];

答案 2 :(得分:0)

我已经解决了这个问题,KVO的代码是正确的,错误在其他地方。我在对象上调用addObserver,但没有正确初始化。