我正在使用Finder Sync Extension构建一个macOS应用程序,它会向Finder添加一个工具栏项。
我创建了这样的工具栏项目菜单:
- (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。
那么这里出了什么问题?
答案 0 :(得分:2)
在Finder中右键单击时显示的菜单和菜单项是您在menu(for menu: FIMenuKind)
中提供的菜单项的副本。
并非所有菜单项的属性都会在副本中存活,导致nil
获得representedObject
值。 NSMenuItem子类也绝对不会被保留。
有关Apple的更多信息,请参阅FinderSync标头:
optional public func menu(for menu: FIMenuKind) -> NSMenu?
使用了特定的菜单项属性:
title
,action
,image
和enabled
。从10.11开始:
tag
,state
和indentationLevel
也可以使用,并允许使用子菜单。
使用菜单项的title
字符串或tag
来确定所需的网址可能是最佳选择。