FinderSync上下文菜单调用错误类中的操作

时间:2015-06-24 10:09:29

标签: objective-c cocoa contextmenu findersync

我在这里遇到了一个非常奇怪的问题:我正在写一个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版本"问题。

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

1 个答案:

答案 0 :(得分:0)

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

  

menu(for menu: FIMenuKind)

     

扩展程序的主要对象为每个菜单项的已分配操作提供了一种方法。

其中声明"扩展程序的主要对象"提供动作方法,如您所见。

  

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

     

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

此受支持的NSMenuItem属性列表中明显缺少target。无法设置操作的指定目标,因此Apple只需在FinderSync子类上调用该操作。

我刚遇到属性representedObject的类似问题。当我们将菜单项作为sender

时,不会保留