【问题标题】:Weird behavior of Finder Sync Extension's tool bar item menuFinder Sync Extension 工具栏项目菜单的奇怪行为
【发布时间】:2017-04-19 16:29:29
【问题描述】:

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

那么这里出了什么问题?

【问题讨论】:

    标签: cocoa nsmenu nsmenuitem appstore-sandbox findersync


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢!我最终将 URL 保存为 NSUserDefaults 中的数组,并将每个项目的标签设置为其 URL 在数组中的索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2015-12-10
    • 2011-02-12
    相关资源
    最近更新 更多