3

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

到目前为止,它工作正常。但是当我更新我的模型时,它不会更新NSMenuItem.

4

2 回答 2

1

作为参考,这个问题的规范解决方案是实现这样的类方法:

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

如果您实现这样的方法,则框架将在任何其他属性发生更改时处理调用willChangeValueForKey:didChangeValueForKey:键。menuItemTitle

于 2012-12-08T13:39:22.313 回答
0

好的,我明白了:

menuItemTitle是一个动态的 getter 方法,它结合了expo. 所以NSMenuItem's 标题没有得到更新的原因可能是,这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"];
}
于 2012-12-07T09:49:17.950 回答