【问题标题】:observeValueForKeyPath: called for every property, not just the observed propertyobserveValueForKeyPath:为每个属性调用,而不仅仅是观察到的属性
【发布时间】:2017-02-17 16:22:25
【问题描述】:

我有一个包含 MyObject 数组的 NSArrayController (itemsController)。这个控制器绑定到一个 NSTableView,它有几个列,所有列都绑定到不同的属性。

我想在应用的其他地方观察这些属性之一。

[[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" 有同样的结果。

【问题讨论】:

  • 我觉得这很难相信。无法观察对象的 所有 属性。你是如何改变属性的?你收到什么keyPathchange 字典?您是否明确调用-will/didChangeValueForKey: 或类似方法?您是否覆盖 KVC 或 KVO 方法(例如 -setValue:forKey:)?数组控制器是在做过滤还是排序? automaticallyRearrangesObjects 是否启用?顺便说一句,毫无疑问:您应该通过 selectionnot selectedObjects 进行绑定。

标签: key-value-observing nsarraycontroller


【解决方案1】:

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

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

【讨论】:

    最近更新 更多