2011-03-05 26 views
7

我在执行一些最初的Cocoa编程时遇到了一些实际的困难。在可可中为NSMenuItem设置目标/动作的正确方法?

本质上,我有一个NSStatusBar项目NSMenu作为菜单附加。菜单有一个NMMenuItem。在IB中,我将NSMenuItem连接到NSObject,它本身被设置为ApplicationDelegate的类;然后,我在ApplicationDelegate中将接收到的操作设置为IBAction方法。我认为所有东西都正确地连接起来,除非我运行程序并单击菜单项IBAction方法未被调用。我似乎无法解决这个问题。这是相关的代码。

应用程序委托.h文件:

#import <Cocoa/Cocoa.h> 

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

- (IBAction)showPreferencePanel:(id)sender; 

@end 

应用程序委托米文件:

#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 

正如我说,在IB我已经在应用程序代理连接在NSMenustatusMenu(因此菜单中的所有显示在NSStatusBar下),并且我已将NSMenu中的NSMenuItem连接到带有应用程序委托类的NSObject,并将其挂接到t o调用showPreferencePanel,但是当我运行它时没有任何反应!

我尝试了编程方式,但仍然无法调用IBAction方法。

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

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

  • FO NSApplication
  • FR FirstResponder
  • 应用NSApplication
  • 字体经理NSFontManager
  • 主菜单NSMenu
    • 菜单项(偏好)NSMenuItem
  • SSS应用代表sssAppDelegate

NSMenuItem:

  • 发送的动作 - showPreferencePanel --->Sss App Delegate

SSS应用代表:

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

你提到你创建了一个包含nib中应用程序委托类的对象;这个笔尖是否与指定实际上是应用程序委托的对象相同?如果没有,我想知道你是否创建了两个应用程序委托对象,这会导致问题(不是这一个),因为它们中只有一个可以真正成为委托。 – 2011-03-06 10:38:32

+0

您是否尝试过记录菜单,其菜单项以及有问题的项目的目标和操作? (使用'NSStringFromSelector'将动作选择器转换为NSString。) – 2011-03-06 10:41:03

+0

感谢您的评论,我为这个问题增加了一些内容,希望能够澄清一些事情。 – Edwardr 2011-03-06 11:40:53

回答

1

编程,你有没有尝试过:

[statusItem setTarget:someTarget]; 
[statusItem setAction:@selector(someSelector)]; 

它应该工作。

相关问题