这里有一个非常奇怪的问题:我正在编写一个FinderSync扩展,更具体地说,我正在向上下文菜单中添加元素。如果我把所有的东西都打包成一个类,它就运行得很好:
1)我有一个名为FinderSync的主扩展类
2)在这个类中,我实现了
- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu3)在这种方法中,我正在写作(除其他外):
NSMenuItem *myItem = [[NSMenuItem alloc]
initWithTitle:@"myTitle"
action:@selector(myAction:)
keyEquivalent:@""];4)在FinderSync类中,存在一个方法
- (IBAction)myAction:(id)sender;5)当用户单击菜单项时,将按预期调用此方法。
Now:,我试图将上下文菜单功能外包给另一个类,称为ContextMenuHandler。现在的情况:
1)我得到了主扩展类FinderSync和另一个名为ContextMenuHandler的类。FinderSync创建一个ContextMenuHandler实例,并保留对它的引用(_contextMenuHandler)。
2)这两个类都实现了
- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu3) FinderSync实现menuForMenuKind除了调用什么都不做。
return [_contextMenuHandler menuForMenuKind:whichMenu];4) ContextMenuHandler创建NSMenuItem。(完全相同的代码)。我甚至试图补充:
[myItem setTarget:self];
[myItem setAction:@selector(myAction:)];两个类都实现了myAction。
5) Expected: myAction of ContextMenuHandler在单击菜单项后将被调用: myAction of FinderSync称为.
我还会在更新后重新启动查找器,ContextMenuHandler中的断点被正确击中,因此它似乎不是“运行旧FinderSync版本”的问题。
有谁能解释(或纠正)这种奇怪的行为吗?
发布于 2016-10-25 09:41:45
FIFinderSyncProtocol文档包括一些有用的上下文:
menu(for menu: FIMenuKind)扩展的主体对象为每个菜单项分配的操作提供了一个方法。
它指出“扩展的主体对象”提供了操作方法,正如您所观察到的。
使用特定的菜单项属性:标题、操作、图像和启用。 从10.11开始:标记、状态和indentationLevel也可以工作,并且允许子菜单。
值得注意的是,支持的NSMenuItem属性列表中没有target。无法为该操作设置指定的目标,因此苹果只需在FinderSync子类上调用该操作。
我刚刚在property representedObject上遇到了一个类似的问题。当我们以sender的形式获得菜单项时,没有持久化。
https://stackoverflow.com/questions/31023752
复制相似问题