2017-04-19 102 views
2

我正在用Finder Sync Extension構建一個macOS應用程序,它向Finder添加了一個工具欄項目。Finder Sync Extension的工具欄項目菜單的奇怪行爲

我創建的工具欄項目菜單是這樣的:

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu { 
    NSMenu *menu = [NSMenu new]; 

    NSURL *URL = ...// Create a NSURL dynamically 

    NSMenuItem *item = [NSMenuItem new]; 
    [item setTitle:@"foo"]; 
    [item setRepresentedObject:URL]; 
    [item setTarget: self]; 
    [item setAction:@selector(itemClicked:)]; 

    [menu addItem:item]; 

    return menu; 
} 

- (void)itemClicked:(NSMenuItem *)item { 
    NSLog(@"%@", item.representedObject); 
} 

的項目都出現了標題爲「foo」的,但是當我點擊它(null)被打印出來。

我也嘗試創建NSMenuItem的子類@property (NSURL*) URL,並在創建項目時設置URL屬性,但在單擊URL屬性後再次變爲nil。

那麼這裏出了什麼問題?

回答

1

當您在Finder中單擊鼠標右鍵時,顯示的菜單和菜單項是您在menu(for menu: FIMenuKind)中提供的菜單項的份副本

並非所有菜單項的屬性都能在副本中生存,從而導致representedObjectnil值。一個NSMenuItem子類也絕對不會被保留下來。

參見FinderSync頭以獲取更多信息從蘋果:

optional public func menu(for menu: FIMenuKind) -> NSMenu?

特定菜單項的屬性被用來:titleactionimage,和enabled

從10.11開始:tag,stateindentationLevel也可以工作,子菜單也是允許的。

使用菜單項的title字符串或tag來確定所需的URL可能是最佳可用選項。

+1

Thx!我最終將URL保存爲NSUserDefaults中的數組,並將每個項目的標記設置爲其在數組中的URL索引。 –