7

我已经根据 Apple 提供的示例实现了 Finder Sync 扩展。

单击新创建的上下文菜单项后,将sampleAction执行相应的操作。不幸的是,传递给该方法的发送者与创建的实例不匹配menuForMenuKind

编码

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu
{
    NSMenuItem* menuItem = [[NSMenuItem alloc] initWithTitle:@"testTitle" action:@selector(sampleAction:) keyEquivalent:@""];
    menuItem.tag = 1;

    // print menu attributes
    NSLog(@"------------------original menu-----------------");
    NSLog(@"menu address: %p", menuItem);
    NSLog(@"menu tag: %ld", menuItem.tag);
    NSLog(@"menu title: '%@'", menuItem.title);

    NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
    [menu addItem:menuItem];

    return menu;
}

- (IBAction)sampleAction:(id)sender
{
    if( [sender isKindOfClass:[NSMenuItem class]])
    {
        NSMenuItem* menuItem = sender;

        NSLog(@"------------------menu passed to action-----------------");
        NSLog(@"menu address: %p", menuItem);
        NSLog(@"menu tag: %ld", menuItem.tag);
        NSLog(@"menu title: '%@'", menuItem.title);
    }
}

在我单击上下文菜单中的元素后导致以下输出

2014-12-07 19:55:36.923 FinderSync Extension[1265:62630] ------------------original menu----------------
2014-12-07 19:55:36.923 FinderSync Extension[1265:62630] menu address: 0x6080000abbe0
2014-12-07 19:55:36.924 FinderSync Extension[1265:62630] menu tag: 1
2014-12-07 19:55:36.924 FinderSync Extension[1265:62630] menu title: 'testTitle'
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] ------------------menu passed to action----------------
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu address: 0x6080000aba00
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu tag: 0
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu title: ''

.

是否有机会将发件人链接到单击的菜单项?

4

2 回答 2

8

作为参考,这显然是预期的行为。我向 Apple 提交了一份错误报告,这是他们的回复:

此问题根据以下情况按预期运行:

Finder Sync 不会保留特定的 NSMenuItem* 实例,并且很少考虑属性(仅标题、操作、图像和启用)。在未来的版本中,可能会支持 -tag 属性,但不支持 -representedObject。— 如果您需要一组动态操作,应该可以使用 sel_registerName 和 method_setImplementation (in ) 等函数在运行时创建方法。

于 2015-07-23T19:43:11.543 回答
2

FIFinderSyncController/ FIFinderSyncProtocoldocs 为我能找到的这些菜单和方法提供了最好的文档。

menu(for menu: FIMenuKind)

使用特定的菜单项属性:标题、操作、图像和启用。

从 10.11 开始:tag、state 和 indentationLevel 也可以使用,并且允许使用子菜单。

您问此问题时未保留的tag属性现在保留在 macOS 10.11+ 中。

在我们收到回调时,该representedObject属性不会持久化,这将非常有用。NSMenuItem 对象在这一点上也有所不同。

这并不理想,但现在持久(并且对用户不可见)tag字段应该足以传递来自菜单创建和操作回调的信息。

于 2016-12-07T00:05:07.640 回答