我有一个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。有谁知道,有什么不对? 感谢
答案 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,但没有正确初始化。