在Cocoa中为NSMenuItem设置目标/操作的正确方法?

Edw*_*rdr 7 cocoa interface-builder nsstatusitem nsmenuitem ibaction

我正在进行一些初步的Cocoa编程,我遇到了一些真正的困难.

从本质上讲,我有一个NSStatusBar与项目NSMenu相连的菜单.菜单有一个NMMenuItem.在IB中,我将NSMenuItem连接到一个NSObject本身设置为ApplicationDelegate类的NSMenuItem ; 然后,我将Received Actions设置IBAction为ApplicationDelegate中的方法.我认为一切都正确连接,除非我运行程序并单击菜单项时IBAction不调用该方法.我真的无法解决这个问题.这是相关的代码.

应用程序委托h文件:

#import <Cocoa/Cocoa.h>

@interface sssAppDelegate : NSObject <NSApplicationDelegate> {
    IBOutlet NSMenu *statusMenu;
    NSStatusItem *statusItem;
}

- (IBAction)showPreferencePanel:(id)sender;

@end
Run Code Online (Sandbox Code Playgroud)

应用程序委托m文件:

#import "sssAppDelegate.h"
@implementation sssAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application 
}

-(void)awakeFromNib{
    statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength] retain];
    [statusItem setMenu:statusMenu];
    [statusItem setTitle:@"Status"];
    [statusItem setHighlightMode:YES];
}


- (IBAction)showPreferencePanel:(id)sender {
    NSLog(@"Hello World!");
}

@end 
Run Code Online (Sandbox Code Playgroud)

正如我所说,在IB我已经连接NSMenustatusMenu的应用程序委托(因此菜单下的所有显示出来NSStatusBar),和我连接了NSMenuItemNSMenuNSObject与应用程序委托类,并迷上它叫showPreferencePanel,但我跑的时候什么都没发生!

我也以编程方式尝试了它,但仍然无法调用IBAction方法.

编辑:我会附上一些屏幕抓取来显示IB中的设置,但我还没有被允许.

主要的笔尖包含添加到的菜单NSStatusBar,它看起来像这样:

  • FO NSApplication
  • FR FirstResponder
  • 应用 NSApplication
  • 字体管理器 NSFontManager
  • 主菜单 NSMenu
    • 菜单项(首选项) NSMenuItem
  • Sss App代表 sssAppDelegate

NSMenuItem:

  • 发送操作 - showPreferencePanel--->Sss App Delegate

Sss App代表:

  • 奥特莱斯 - statusMenu--->Main Menu
  • 收到的行动 - showPreferencePanel:--->Main Item (Preferences)

Jea*_*ean 2

以编程方式,您是否尝试过:

[statusItem setTarget:someTarget];
[statusItem setAction:@selector(someSelector)];
Run Code Online (Sandbox Code Playgroud)

它应该有效。