【问题标题】:KVO on bool property, not invoke observeValueForKeyPath布尔属性上的 KVO,不调用 observeValueForKeyPath
【发布时间】:2013-02-14 09:19:51
【问题描述】:

我有一个 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 永远不会被调用。有谁知道,有什么问题吗? 谢谢

【问题讨论】:

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


    【解决方案1】:

    看起来一个问题是您说该属性是BOOL,但您试图在setValue 调用中将其设置为NSNumber

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

       self.touchInsideLayerWindow = YES;
    

    【讨论】:

    • 嗯,我知道,但我没有找到任何其他方法,如何设置布尔值,因为它不是对象......
    • 我甚至在我目前的解决方案之前就使用了点语法,但这也不起作用。 :(
    • 正如@sellers 所说,使用@synthesize 提供对KVO 的自动支持
    【解决方案2】:

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

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

    【讨论】:

    • 嗯,这没什么变化,因为基本上和我的代码一样,总的来说。
    • 是的,基本相同,没有willChangedidChange 调用:)。也尝试添加这两个
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多