Jef*_*Jef 4 objective-c key-value-observing key-value-coding nsarraycontroller cocoa-bindings
在我的界面中,我有一个NSTextField谁value被绑定了NSArrayController's selection.selectedType.title.所有NSArrayController's对象都是自定义对象,每个对象有两种方法:
- (MYType *)selectedType;
- (void)setSelectedType: (MYType *)type;
Run Code Online (Sandbox Code Playgroud)
在不具有伊娃selectedType.但是,他们确实拥有一个容纳所有MYType物体的iVar .代码归结为:
- (MYType *)selectedType
{
if (someIndex == 0)
return [types objectAtIndex: 0];
else
return [self typeWithIndex: someIndex];
}
- (void)setSelectedType: (MYType *)type
{
someIndex = [type index];
}
Run Code Online (Sandbox Code Playgroud)
MYType对象得到了NSString *title一个相应的@property和iVar synthesize.
每当我打电话setSelectedType:,变化立即可见,NSTextField并且一切似乎都有效,但我得到一条日志消息说:
无法从MYType 0x1a4830中删除关键路径"selectedType.title"的观察者NSArrayController 0x141160,这很可能是因为在没有发送适当的KVO通知的情况下,"selectedType"键的值已更改.检查MYType类的KVO兼容性.
我尝试setSelectedType:使用willChangeValueForKey:和封装方法didChangeValueForKey:然后我仍然有一个日志消息,但不同的一个:
无法从MYType 0x1a4be0中删除关键路径"title"的观察者NSKeyValueObservance 0x1c7570,因为它未注册为观察者.
首先,使用访问器.不要直接访问您的ivars.您绕过KVO someIndex因为您直接修改了ivar.除非必须,否则不要直接触摸ivars.
您还需要让KVO知道这selectedType取决于someIndex(和/或someStuff;从您的提炼代码中不清楚).
+ (NSSet *)keyPathsForValuesAffectingSelectedType
{
return [NSSet setWithObjects:@"someIndex", nil];
}
Run Code Online (Sandbox Code Playgroud)
这告诉KVO系统每当someIndex发生变化时,都会导致隐式变化selectedType.请参阅注册从属密钥.
| 归档时间: |
|
| 查看次数: |
3136 次 |
| 最近记录: |