Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Cocoa中为NSMenuItem设置目标/操作的正确方法?_Cocoa_Interface Builder_Nsmenuitem_Ibaction_Nsstatusitem - Fatal编程技术网

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

在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文件:

我在进行一些初始的Cocoa编程时遇到了一些真正的困难

基本上,我有一个
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
NSMenuItem:

  • 已发送操作-
    showPreferencePanel
    -->
    Sss应用程序代理
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)];