3

我正在使用 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)被打印出来了。

我还尝试创建NSMenuItemwith的子类@property (NSURL*) URL,并在创建项目时设置 URL 属性,但单击后 URL 属性再次变为 nil。

那么这里出了什么问题呢?

4

1 回答 1

3

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

并非所有菜单项的属性都能在副本中保留下来,从而获得nil您获得的价值representedObject。NSMenuItem 子类也绝对不会被保留。

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

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

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

从 10.11 开始:tag, state, and indentationLevelalso work, 和子菜单是允许的。

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

于 2017-04-20T02:35:17.047 回答