在NSMenuItem中显示模型的数据

时间:2012-12-05 13:26:20

标签: objective-c cocoa-bindings 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的标题。

2 个答案:

答案 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:的密钥。