我在这里遇到了一个非常奇怪的问题:我正在写一个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版本"问题。
是否有人对这种奇怪的行为有解释(或修复)?
答案 0 :(得分:0)
FIFinderSyncProtocol
文档包含一些有用的上下文:
menu(for menu: FIMenuKind)
扩展程序的主要对象为每个菜单项的已分配操作提供了一种方法。
其中声明"扩展程序的主要对象"提供动作方法,如您所见。
使用特定菜单项属性:标题,动作,图像和启用。
从10.11开始:tag,state和indentationLevel也可以工作,并且允许子菜单。
此受支持的NSMenuItem
属性列表中明显缺少target
。无法设置操作的指定目标,因此Apple只需在FinderSync子类上调用该操作。
我刚遇到属性representedObject
的类似问题。当我们将菜单项作为sender
。