在Cocoa中为NSMenuItem设置目标/操作的正确方法?
我在进行一些初始的Cocoa编程时遇到了一些真正的困难 基本上,我有一个在Cocoa中为NSMenuItem设置目标/操作的正确方法?,cocoa,interface-builder,nsmenuitem,ibaction,nsstatusitem,Cocoa,Interface Builder,Nsmenuitem,Ibaction,Nsstatusitem,我在进行一些初始的Cocoa编程时遇到了一些真正的困难 基本上,我有一个NSStatusBar项,菜单中附加了一个NSMenu。该菜单有一个NMMenuItem。在IB中,我已将NSMenuItem连接到一个本身设置为ApplicationLegate类的NSObject;然后,我在ApplicationLegate中将收到的操作设置为iAction方法。我想一切都连接正确了,除了运行程序并单击菜单项时,iAction方法没有被调用。我似乎真的无法解决这个问题。这是相关代码 应用程序委托h文件:
NSStatusBar
项,菜单中附加了一个NSMenu
。该菜单有一个NMMenuItem
。在IB中,我已将NSMenuItem连接到一个本身设置为ApplicationLegate类的NSObject
;然后,我在ApplicationLegate中将收到的操作设置为iAction
方法。我想一切都连接正确了,除了运行程序并单击菜单项时,iAction
方法没有被调用。我似乎真的无法解决这个问题。这是相关代码
应用程序委托h文件:
#import <Cocoa/Cocoa.h>
@interface sssAppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSMenu *statusMenu;
NSStatusItem *statusItem;
}
- (IBAction)showPreferencePanel:(id)sender;
@end
正如我所说,在IB中,我已将NSMenu
连接到应用程序委托中的statusMenu
(因此菜单都显示在NSStatusBar
下),并且我已将NSMenu
中的NSMenuItem
连接到带有应用程序委托类的NSObject
,并将其连接到呼叫showPreferencePanel,但在我运行它时什么也没有发生
我也用编程的方式尝试过,但仍然无法调用IBAction方法
编辑:我会附加一些屏幕抓图以在IB中显示设置,但我还不被允许
包含添加到NSStatusBar
的菜单的主nib如下所示:
- FO
n应用程序
- FR
FirstResponder
- 应用程序
n应用程序
- 字体管理器
NSFontManager
- 主菜单
NSMenu
- 菜单项(首选项)
NSMenuItem
- 菜单项(首选项)
- Sss应用程序代理
SSSAPProdelegate
- 已发送操作-
-->showPreferencePanel
Sss应用程序代理
- 插座-
状态菜单-->
主菜单
- 已接收操作-
-->showPreferencePanel:
主项(首选项)
[statusItem setTarget:someTarget];
[statusItem setAction:@selector(someSelector)];
它应该可以工作。您提到您在nib中使用应用程序委托的类创建了一个对象;这个nib是否与您指定对象作为实际应用程序委托的nib相同?如果不是,我想知道您是否偶然创建了两个应用程序委托对象,这会导致问题(不是这一个),因为一次只能有一个对象是委托。您是否尝试记录菜单、菜单项以及相关项的目标和操作?(使用
NSStringFromSelector
将操作选择器转换为NSString。)感谢您的评论,我在问题中添加了更多内容,希望能在一定程度上澄清问题。我刚刚制作了一个示例项目,按照您的描述进行设置,一切似乎都很好。状态栏项出现,它包含整个主菜单,当我选择AppName>Preferences时,我会在日志中看到一条消息。您应该在applicationdFinishLaunching:
中粘贴一个NSLog
调用,以确保此对象确实是应用程序的委托。如果是这样的话,我唯一的建议就是从头开始创建一个示例项目,其中只包含您遇到问题的这个功能,以确保您不会错过任何东西,并且真正将所有东西正确地连接起来。
[statusItem setTarget:someTarget];
[statusItem setAction:@selector(someSelector)];