【发布时间】:2011-03-05 19:38:21
【问题描述】:
我在执行一些初始 Cocoa 编程时遇到了一些真正的困难。
基本上,我有一个NSStatusBar 项目,并附有一个NSMenu 作为菜单。菜单有一个NMMenuItem。在 IB 中,我已将 NSMenuItem 连接到 NSObject,而 NSObject 本身已设置为 ApplicationDelegate 的类;然后,我在 ApplicationDelegate 中将 Received Actions 设置为 IBAction 方法。我认为一切都正确连接,除了当我运行程序并单击菜单项时,IBAction 方法未被调用。我真的好像搞不定。这是相关代码。
应用程序委托 h 文件:
#import <Cocoa/Cocoa.h>
@interface sssAppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSMenu *statusMenu;
NSStatusItem *statusItem;
}
- (IBAction)showPreferencePanel:(id)sender;
@end
应用委托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
正如我所说,在 IB 中,我已将 NSMenu 连接到 Application Delegate 中的 statusMenu(因此菜单都显示在 NSStatusBar 下),并且我已在 @987654333 中连接了 NSMenuItem @ 到 NSObject 与 Application Delegate 类,并将其连接到调用 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)
【问题讨论】:
-
您提到您在 nib 中使用应用程序委托的类创建了一个对象;这个笔尖与您指定对象实际作为应用程序委托的笔尖相同吗?如果没有,我想知道您是否意外创建了两个应用程序委托对象,这会导致问题(不是这个),因为一次只有一个可以真正成为委托。
-
您是否尝试过记录菜单、菜单项以及相关项目的目标和操作? (使用
NSStringFromSelector将操作选择器转换为 NSString。) -
感谢 cmets,我在问题中添加了更多内容,希望能在一定程度上澄清问题。
-
我刚刚制作了一个示例项目,按照您的描述进行了设置,对我来说似乎一切正常。出现状态栏项目,它包含整个主菜单,当我选择 AppName>Preferences 时,我在日志中收到一条消息。您应该在
applicationDidFinishLaunching:中加入NSLog调用,以确保该对象确实是应用程序的委托。如果是这样,我唯一的建议是从头开始制作一个示例项目,其中仅包含您遇到问题的此功能,以确保您不会错过任何内容,并且确实确实将所有内容正确连接。
标签: cocoa interface-builder nsmenuitem ibaction nsstatusitem