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

Weird behavior of Finder Sync Extension's tool bar item menu

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

我还尝试使用 @property (NSURL*) URL 创建 NSMenuItem 的子类,并在创建项目时设置 URL 属性,但是在单击 URL 属性又变成nil了

那么这里出了什么问题?

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

并非所有菜单项的属性都能在副本中保留下来,从而导致您为 representedObject 获得的 nil 值。一个 NSMenuItem 子类也肯定不会被保留。

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

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

Specific menu item properties are used: title, action, image, and enabled.

Starting in 10.11: tag, state, and indentationLevel also work, and submenus are allowed.

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