Finder Sync:传递给动作的Sender是NSMenuItem的不同实例

时间:2014-12-07 19:20:31

标签: macos finder nsmenuitem findersync

我已根据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: ''

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

2 个答案:

答案 0 :(得分:7)

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

此问题的行为基于以下内容:

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

答案 1 :(得分:1)

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

  

menu(for menu: FIMenuKind)

     

使用特定菜单项属性:标题,动作,图像和启用。

     

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

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

我们获得回调时,representedObject属性持久存在,这将非常有用。 NSMenuItem对象也是不同的。

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