【问题标题】:KVO - observeValueForKeyPath not called when observing an enumKVO - 观察枚举时未调用observeValueForKeyPath
【发布时间】:2011-07-13 18:22:51
【问题描述】:

我之前使用过 NSNotifications,但这是我第一次尝试在 Cocoa Touch 中使用 KVO。

我的 UITableView 控制器在各种数据源之间切换,因此我将它们封装在不同的 UITableViewDataSource 子类中。我试图让我的视图控制器观察其中一个特定的 UITableViewDataSource 子类并跟踪一个名为 loadState 的枚举,它反映了模型的加载状态。

我这样设置观察者:

[self.siteUpdatesDataSource addObserver:self
                             forKeyPath:@"loadState"
                                options:0
                                context:nil];

从调试器中我可以看到观察者已注册:

(gdb) po [self siteUpdatesDataSource]
<SiteUpdatesTableViewDataSource: 0x651e5a0>
Current language:  auto; currently objective-c
(gdb) po [[self siteUpdatesDataSource] observationInfo]
<NSKeyValueObservationInfo 0x651dd70> (
<NSKeyValueObservance 0x651dd10: Observer: 0xc80f1e0, Key path: loadState, Options: <New: NO, Old: NO, Prior: NO> Context: 0x0, Property: 0x651dd90>

)

但是,我的 viewController 中的 observeValueForKeyPath 方法似乎从未被调用过。我设置了一个断点,即使我验证枚举已更改,也没有任何东西到达它。

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

   [self.tableView reloadData];
}

感谢任何关于我所缺少的东西的想法。

【问题讨论】:

    标签: iphone cocoa-touch key-value-observing


    【解决方案1】:

    看不出有什么问题。您确定通过调用合成访问器或使用 KVC 或手动更改loadState 属性(使用willChangeValueForKey:didChangeValueForKey:) 通知更改?

    【讨论】:

    • 谢谢你成功了。我会尝试更多的尝试并找出为什么枚举似乎没有产生变化。我正在为枚举使用合成的 setter 和 getter,并通过它们进行更新 self.loadState = kDataReady 例如
    • 等等,你说'成功了',下一行你说'枚举似乎没有产生变化'。它是否有效?我对综合枚举属性没有任何问题。
    • 抱歉,这行得通。后来我发现我在一个地方不正确地设置了我的枚举。不幸的是,当我停止使用 updaet 时,StackOverflow 处于只读模式。很抱歉造成混淆,即使我的问题出在其他地方,这种方法允许我触发观察者事件并帮助我追踪问题。
    猜你喜欢
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多