KVO:无法移除观察者

时间:2012-02-08 18:05:49

标签: objective-c cocoa-bindings key-value-observing nsarraycontroller key-value-coding

在我的界面中,我有一个NSTextField value与[{1}} NSArrayController's绑定。所有selection.selectedType.title个对象都是自定义对象,每个对象都有两个方法:

NSArrayController's

拥有iVar - (MYType *)selectedType; - (void)setSelectedType: (MYType *)type; 。但是,他们确实拥有一个包含所有selectedType个对象的iVar。代码归结为:

MYType

- (MYType *)selectedType { if (someIndex == 0) return [types objectAtIndex: 0]; else return [self typeWithIndex: someIndex]; } - (void)setSelectedType: (MYType *)type { someIndex = [type index]; } 个对象获得MYType iVar,其中包含相应的NSString *title@property

每当我致电synthesize时,更改都会立即显示在setSelectedType:中,一切似乎都有效,但我收到一条日志消息说:

  

无法删除密钥的观察者NSArrayController 0x141160   来自MYType 0x1a4830的路径“selectedType.title”,大多数   可能是因为键“selectedType”的值有   在没有发送适当的KVO通知的情况下更改。检查   MYType类的KVO兼容性。

我尝试使用NSTextFieldsetSelectedType:封装willChangeValueForKey:方法,然后我仍然收到一条不同的日志消息:

  

无法删除密钥的观察者NSKeyValueObservance 0x1c7570   来自MYType 0x1a4be0的路径“title”,因为它未注册为   观察者。

2 个答案:

答案 0 :(得分:5)

首先,使用访问者。不要直接访问您的ivars。您绕过someIndex的KVO,因为您直接修改了ivar。除非必须,否则不要直接触摸ivars。

您还需要让KVO知道selectedType取决于someIndex(和/或someStuff;您的提炼代码并不清楚。

+ (NSSet *)keyPathsForValuesAffectingSelectedType
{
  return [NSSet setWithObjects:@"someIndex", nil];
}

这告诉KVO系统,只要someIndex发生变化,就会导致selectedType的隐式更改。请参阅Registering Dependent Keys

答案 1 :(得分:0)

我遇到了同样的错误,但原因不同。可能值得一提的是万一其他人在这里结束。

我正在Swift中编写应用程序,但我忘了在var前加上dynamic