4

在我的界面中,我有一个NSTextField谁的value绑定到NSArrayController'sselection.selectedType.title。所有NSArrayController's对象都是自定义对象各有两种方法:KVO:无法删除观察者

- (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对象得到了NSString *title伊娃与相应@propertysynthesize

每当我打电话setSelectedType:,变化是在NSTextField立即可见,一切似乎工作,但我得到一个日志消息说:

无法删除观察员NSArrayController的0x141160为重点 路径“selectedType。标题“,最可能的原因是 ,因为在没有发送适当的KVO通知的情况下更改了”selectedType“键值的 。检查MY35类的KVO符合性 。

我试图封装setSelectedType:willChangeValueForKey:didChangeValueForKey:,然后我仍然有一个日志消息,但不同的一个:

无法删除观察员NSKeyValueObservance 0x1c7570为重点 路径“称号”,从MYType 0x1a4be0,因为它未注册为观察员 。

回答

5

首先,使用访问器。不要直接访问你的ivars。由于您直接修改了伊娃,因此您绕过了someIndex的KVO。除非必须,否则不要直接接触ivars。

您还需要让KVO知道selectedType取决于someIndex(和/或someStuff;从您的蒸馏代码中不清楚)。

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

这告诉志愿系统,每当someIndex变化,这导致selectedType隐式的变化。请参阅Registering Dependent Keys

0

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

我正在Swift上编写一个应用程序,但我忘记在var前加上dynamic