我在执行一些最初的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我已经在应用程序代理连接在NSMenu
到statusMenu
(因此菜单中的所有显示在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)
你提到你创建了一个包含nib中应用程序委托类的对象;这个笔尖是否与指定实际上是应用程序委托的对象相同?如果没有,我想知道你是否创建了两个应用程序委托对象,这会导致问题(不是这一个),因为它们中只有一个可以真正成为委托。 – 2011-03-06 10:38:32
您是否尝试过记录菜单,其菜单项以及有问题的项目的目标和操作? (使用'NSStringFromSelector'将动作选择器转换为NSString。) – 2011-03-06 10:41:03
感谢您的评论,我为这个问题增加了一些内容,希望能够澄清一些事情。 – Edwardr 2011-03-06 11:40:53