在我的界面中,我有一个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兼容性。
我尝试使用NSTextField
和setSelectedType:
封装willChangeValueForKey:
方法,然后我仍然收到一条不同的日志消息:
无法删除密钥的观察者NSKeyValueObservance 0x1c7570 来自MYType 0x1a4be0的路径“title”,因为它未注册为 观察者。
答案 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