Objective c 单击菜单项时没有回调
我试图在FinderSync扩展中实现一个简单的上下文菜单 我使用一些示例构建了以下内容,我的问题是,当我单击菜单项时,从未调用回调 源代码: ContextMenuHelper.hObjective c 单击菜单项时没有回调,objective-c,macos,selector,nsmenu,findersync,Objective C,Macos,Selector,Nsmenu,Findersync,我试图在FinderSync扩展中实现一个简单的上下文菜单 我使用一些示例构建了以下内容,我的问题是,当我单击菜单项时,从未调用回调 源代码: ContextMenuHelper.h #import <Foundation/Foundation.h> #include "FinderSync.h" @interface ContextMenuHelper : NSObject + (NSMenu *)buildMenu; @end MyFinderSync.m #import
#import <Foundation/Foundation.h>
#include "FinderSync.h"
@interface ContextMenuHelper : NSObject
+ (NSMenu *)buildMenu;
@end
MyFinderSync.m
#import "ContextMenuHelper.h"
#define SharedContextMenuTarget [ContextMenuTarget sharedInstance]
@interface ContextMenuTarget : NSObject
+ (ContextMenuTarget *) sharedInstance;
@end
@implementation ContextMenuTarget
- (void) callback : (id)sender {
NSLog(@"Called back!!!");
}
+ (ContextMenuTarget *) sharedInstance
{
static ContextMenuTarget *sharedContextMenuTarget = nil;
@synchronized(self)
{
if (!sharedContextMenuTarget)
sharedContextMenuTarget = [[ContextMenuTarget alloc] init];
return sharedContextMenuTarget;
}
}
@end
@implementation ContextMenuHelper
+ (NSMenu *)buildMenu
{
ContextMenuTarget *contextMenuTarget = SharedContextMenuTarget;
NSMenu *mySubmenu = [[NSMenu alloc] initWithTitle:@""];
NSMenuItem *newMenu = [[NSMenuItem alloc] initWithTitle:@"hello"
action:@selector(callback:)
keyEquivalent:@""];
[newMenu setTarget:contextMenuTarget];
[mySubmenu addItem:newMenu];
return mySubmenu;
}
@end
...
- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu {
NSMenu *myContextMenu = [[NSMenu alloc] initWithTitle:@""];
@try
{
if(whichMenu != FIMenuKindContextualMenuForItems) {
return myContextMenu;
}
myContextMenu = [ContextMenuHelper buildMenu];
}
@catch (NSException *ex)
{
}
return myContextMenu;
}
...
显然,只有当目标是
FinderSync
的实例时,回调才会起作用。找不到任何支持此理论的文档,但唯一解决此问题的方法是将上下文菜单代码移动到MyFinderSync.m:
...
- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu {
NSMenu *myContextMenu = [[NSMenu alloc] initWithTitle:@""];
@try
{
if(whichMenu != FIMenuKindContextualMenuForItems) {
return myContextMenu;
}
myContextMenu = [self buildMenu];
}
@catch (NSException *ex)
{
}
return myContextMenu;
}
- (NSMenu *)buildMenu
{
NSMenu *mySubmenu = [[NSMenu alloc] initWithTitle:@""];
NSMenuItem *newMenu = [[NSMenuItem alloc] initWithTitle:@"hello"
action:@selector(callback:)
keyEquivalent:@""];
[newMenu setTarget:self];
[mySubmenu addItem:newMenu];
return mySubmenu;
}
- (void) callback : (id)sender {
NSLog(@"Called back!!!");
}
...
我发现下面的例子:看起来比我的尝试要复杂得多。真的有必要吗?