我想在状态栏菜单中显示我的模型的一些数据。因此,我将实体对象绑定到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的标题。
发布于 2012-12-08 21:39:22
作为参考,此问题的规范解决方案是实现如下所示的类方法:
+ (NSSet *)keyPathsForValuesAffectingMenuItemTitle
{
return [NSSet setWithObjects: @"propertyMenuItemTitleDependsOn1",
@"propertyMenuItemTitleDependsOn2",
nil];
}如果您实现了这样的方法,那么框架将在任何其他属性发生更改时处理键menuItemTitle的willChangeValueForKey:和didChangeValueForKey:调用。
发布于 2012-12-07 17:49:18
好的,我明白了:
menuItemTitle是一种结合了expo的两个实际属性的动态getter方法。因此,NSMenuItem的标题没有更新的原因可能是,menuItemTitle可能从未真正设置过。
那么,当我的一个属性被设置时,我如何判断menuItemTitle是否被更改了呢?覆盖expo的设置器来添加[self willChangeValueForKey:@"menuItemTitle"];和[self didChangeValueForKey:@"menuItemTitle"];是行不通的,因为它会导致一个无限的循环,一次又一次地调用设置器本身。
下面是我的解决方案:我重写了[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"];
}https://stackoverflow.com/questions/13724306
复制相似问题