Finder Sync Extension工具栏项目菜单的奇怪行为

时间:2017-04-19 16:29:29

标签: cocoa nsmenu nsmenuitem appstore-sandbox findersync

我正在使用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。

那么这里出了什么问题?

1 个答案:

答案 0 :(得分:2)

在Finder中右键单击时显示的菜单和菜单项是您在menu(for menu: FIMenuKind)中提供的菜单项的副本

并非所有菜单项的属性都会在副本中存活,导致nil获得representedObject值。 NSMenuItem子类也绝对不会被保留。

有关Apple的更多信息,请参阅FinderSync标头:

  

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

     

使用了特定的菜单项属性:titleactionimageenabled

     

从10.11开始:tagstateindentationLevel也可以使用,并允许使用子菜单。

使用菜单项的title字符串或tag来确定所需的网址可能是最佳选择。