【问题标题】:Correct way to setup target/action for NSMenuItem in Cocoa?在 Cocoa 中为 NSMenuItem 设置目标/操作的正确方法?
【发布时间】: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 的菜单的主笔尖,如下所示:

  • FONSApplication
  • 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


【解决方案1】:

以编程方式,你试过了吗:

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

它应该可以工作。

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多