3

我有一个 appDelegate,它有一个属性 myWindow 的 MyWindowClass。我需要从 myWindow 观察 bool 属性。比我有一个 CustomViewController,需要观察布尔值的变化。如果我想添加观察者,我会在 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 永远不会被调用。有谁知道,有什么问题吗?谢谢

4

3 回答 3

3

看起来一个问题是您说该属性是 a BOOL,但您正试图NSNumbersetValue调用中将其设置为 a 。

第二:如果你用 来做你的设置器@synthesize,那么只要你使用点语法,就会自动支持 KVO。

   self.touchInsideLayerWindow = YES;
于 2013-02-14T10:37:42.307 回答
0

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

[self willChangeValueForKey:@"touchInsideLayerWindow"];
[self setValue:[NSNumber numberWithBool: YES]forKey:@"touchInsideLayerWindow"];
[self didChangeValueForKey:@"touchInsideLayerWindow"];
于 2013-02-14T09:45:40.303 回答
0

我已经解决了这个问题,KVO 的代码是正确的,错误在别处。我在对象上调用 addObserver,但未正确初始化。

于 2013-02-14T11:36:55.287 回答