2017-02-17 108 views
0

我有一个NSArrayController(上述ItemsController),其保持为MyObject的阵列。这个控制器绑定到一个NSTableView,它有几列,都绑定到不同的属性。observeValueForKeyPath:称为对于每个属性,不只是观察到的属性

我想观察应用程序中其他位置的其中一个属性。

[[self itemsController] addObserver:self forKeyPath:@"selectedObjects.someProperty" options:NSKeyValueObservingOptionNew context:nil]; 

在回调:

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

我收到称为每当在选择更改任何财产,但我只是想叫时someProperty在选定对象的变化。

当没有真正改变时,我怎样才能防止所有这些其他呼叫?

观察@ “selection.someProperty” 具有相同的结果。

+0

我觉得这很难相信。无法观察对象的* all *属性。你如何改变这些属性?你正在接收什么'keyPath'和'change'字典?你是否明确地调用'-will/didChangeValueForKey:'或类似的方法?您是否覆盖KVC或KVO方法(例如'-setValue:forKey:')?数组控制器是否正在进行过滤或排序?是否启用了“automaticRearrangesObjects”?顺便说一句,毫无疑问,你应该通过'selection'和** not **'selectedObjects'来绑定。 –

回答

1

也得到通知时selectedObjectsselection变化。如果您想在someProperty更改时收到通知,那么您必须观察所选对象的someProperty,并在选择更改时删除并添加观察者。

观察类的超类也可以观察。使用context参数识别您的通知。见Best practices for context parameter in addObserver (KVO)