我想在状态栏菜单中显示我的模型的一些数据。所以,我将我的实体对象绑定到NSMenuItem
的标题:
[self.statusMenu setAutoenablesItems:NO];
NSMenuItem * exportMenuItem = [[NSMenuItem alloc] init];
[exportMenuItem bind:@"title" toObject:expo withKeyPath:@"menuItemTitle" options:nil];
[exportMenuItem setEnabled:NO];
[self.statusMenu insertItem:exportMenuItem atIndex:3];
它从init到目前为止工作正常。但是当我更新我的模型时,它不会更新NSMenuItem
的标题。
答案 0 :(得分:0)
好的,我明白了:
menuItemTitle
是一种动态getter方法,它结合了expo
的两个实际属性。因此NSMenuItem
标题未被更新的原因可能是,menuItemTitle
可能永远不会实际设置。
那么,当我设置了一个属性时,如何判断menuItemTitle
已被更改?
覆盖expo
的setter以添加[self willChangeValueForKey:@"menuItemTitle"];
和[self didChangeValueForKey:@"menuItemTitle"];
不起作用,因为它会一次又一次地调用setter本身导致无限循环。
所以这是我的解决方案:我覆盖了[NSManagedObject setValue:(id)value forKey:(NSString *)key]
:
- (void)setValue:(id)value forKey:(NSString *)key {
[self willChangeValueForKey:@"menuItemTitle"];
[super setValue:value forKey:key];
[self didChangeValueForKey:@"menuItemTitle"];
}
答案 1 :(得分:0)
作为参考,这个问题的规范解决方案是实现这样的类方法:
+ (NSSet *)keyPathsForValuesAffectingMenuItemTitle
{
return [NSSet setWithObjects: @"propertyMenuItemTitleDependsOn1",
@"propertyMenuItemTitleDependsOn2",
nil];
}
如果你实现了这样的方法,那么只要任何其他属性发生变化,框架就会处理willChangeValueForKey:
和didChangeValueForKey:
的密钥。