2012-12-05 27 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"]; 
} 
相關問題