2012-12-05 31 views
2

我想在状态栏菜单中显示我的模型的一些数据。所以,我必将我的实体对象一个NSMenuItem的标题:在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

如果不知道更多关于对象'expo'的信息,为什么不更新菜单项标题?它是否符合'menuItemTitle'这个关键字的KVO标准? “menuItemTitle”的值如何更新? (你可能也想使用'NSTitleBinding'而不是'@“title”'。) – ipmcc

+0

@ipmcc嘿,由于你的回答,我猜是原因。 'menuItemTitle'不是一个真正的财产。它只是一种将expo的不同属性组合到单个字符串中的方法。 (接受'NSTitleBinding') –

回答

0

仅供参考,规范的解决这个问题是要实现一个类的方法是这样的:如果实现

+ (NSSet *)keyPathsForValuesAffectingMenuItemTitle 
{ 
    return [NSSet setWithObjects: @"propertyMenuItemTitleDependsOn1", 
            @"propertyMenuItemTitleDependsOn2", 
            nil]; 
} 

方法,那么框架将在任何其他属性发生更改时处理调用willChangeValueForKey:didChangeValueForKey:的密钥menuItemTitle

0

好,我知道了:

menuItemTitle是它结合的expo两个实际性能的动态getter方法。所以NSMenuItem的标题没有得到更新的原因可能是,menuItemTitle可能永远不会被设置。

那么我怎么知道menuItemTitle已经改变了,当我的一个属性被设置? 覆盖expo的设置器添加[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"]; 
} 
相关问题