3

我在这里遇到了一个非常奇怪的问题:我正在编写一个 FinderSync 扩展,更具体地说,我正在向上下文菜单添加元素。现在,如果我将所有内容打包到一个类中,它运行良好:

1)我有一个主要的扩展类,叫做 FinderSync

2)在这个类中,我实现

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu

3)在这种方法中,我正在写(除其他外):

NSMenuItem *myItem = [[NSMenuItem alloc]
            initWithTitle:@"myTitle" 
            action:@selector(myAction:)
            keyEquivalent:@""];

4)在FinderSync类中,存在方法

- (IBAction)myAction:(id)sender;

5) 当用户点击菜单项时,该方法按预期调用。

现在:我正在尝试将上下文菜单功能外包给另一个名为 ContextMenuHandler 的类。现在的情况:

1) 我有一个名为 FinderSync 的主扩展类和另一个名为 ContextMenuHandler 的类。FinderSync 创建一个 ContextMenuHandler 实例并保留对它的引用 (_contextMenuHandler)。

2)两个类都实现

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu

3) menuForMenuKind 的 FinderSync 实现只调用

return [_contextMenuHandler menuForMenuKind:whichMenu];

4) ContextMenuHandler 创建 NSMenuItem。(完全相同的代码)。我什至尝试添加:

[myItem setTarget:self];
[myItem setAction:@selector(myAction:)];

这两个类都实现了 myAction。

5)预期:点击菜单项后会调用 ContextMenuHandler 的 myAction观察到:调用 FinderSync 的 myAction...

我也在更新后重新启动 finder,并且 ContextMenuHandler 中的断点被正确命中,所以它似乎不是“运行旧 FinderSync 版本”的问题。

有人对这种奇怪的行为有解释(或修复)吗?

4

1 回答 1

0

FIFinderSyncProtocol文档包括一些有用 的上下文:

menu(for menu: FIMenuKind)

扩展的主体对象为每个菜单项的指定操作提供了一种方法。

正如您所观察到的,其中指出“扩展的主要对象”提供了操作方法。

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

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

值得注意的是,此受支持NSMenuItem属性列表中没有target. 无法设置动作的指定目标,因此 Apple 只需在 FinderSync 子类上调用动作。

我刚刚遇到了与 property 类似的问题representedObject。在我们将菜单项作为sender.

于 2016-10-25T09:41:45.583 回答