如何设置菜单项单击以响应来自另一个类的IBAction?

时间:2014-11-07 15:11:13

标签: objective-c xcode cocoa

我对XCode / Objective-C / Cocoa很陌生。我想为我的应用实现一个设置窗口。

我有一个MainMenu.xib,它也拥有我的主窗口。从菜单中,我想打开一个设置窗口。我创建了Settings.xib和相应的.h.m文件来保存该窗口的功能。

Settings.h:

#import <Cocoa/Cocoa.h>

@interface Settings : NSWindowController <NSApplicationDelegate>

-(IBAction)openSettings:(id)senderId;

@property (nonatomic, retain) Settings *thisWindow;

@end

Settings.m:

#import "Settings.h"

@implementation Settings

- (void)windowDidLoad {
    [super windowDidLoad];

    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}

// open preferences window
- (IBAction)openSettings:(id)senderId
{
    _thisWindow = [[Settings alloc] initWithWindowNibName:@"Settings"];
    [_thisWindow showWindow:self];
}

@end

我将Preferences菜单项拖到第一响应者,然后从那里选择openSettings:。 但是,该项目仍处于停用状态,我非常确定,因为我没有做任何事情将Settings界面链接到MainMenu.xibAppDelegate.h/m与{{1}}一起使用。

如何使这项工作?我发现的所有其他解决方案对我来说都没有用。

3 个答案:

答案 0 :(得分:0)

如果我明白你想要将MainMenu和MainWindowController存储在两个单独的类中。

  1. 打开主菜单nib-file。从对象树中删除窗口。
  2. 签入项目设置 - &gt;一般 - &gt;主界面仍然是您的MainMenu(没有.xib扩展名)。
  3. 创建(实现)您的自定义MainWindowController类(可能有一个nib文件)。
  4. 打开AppDelegate类。在- (void)applicationDidFinishLaunching:(NSNotification *)aNotification方法中创建主窗口控制器类的实例,显示窗口
  5. 使用以下代码

    MainWindowController *controller=[[MainWindowController alloc] initWithNibName:@"MainWindowController"];
    [controller showWindow:nil];
    [controller.window makeKeyAndOrderFront:nil];
    

    在这里。

答案 1 :(得分:0)

好的,在你的mainwindowcontroller中,声明一个类型为NSWindowController * settingsWindow的属性。使用相应的xib初始化它。

然后创建一个名为-(void)openSettings的方法,其中一行[self.settingsWindow showWindow:self];

然后在你的mainWindowController初始化中,初始化一个NSMenuItem,并将它的动作设置为openSettings。然后将NSMenuItem添加到您想要以编程方式进行的Mainmenu,例如

//mainMenu is your application's menu-- if you switched index to 1 it would be the 'File' menu
NSMenu *mainMenu = [[[NSApp mainMenu] itemAtIndex:0] submenu];
[mainMenu insertItem:newItem atIndex:4];

答案 2 :(得分:0)

我最终使用AppDeleate.m来打开对话框。我将菜单按钮链接到界面构建器中的AppDelegate对象,并使用openSettings:。这是它的外观:

// open preferences window
- (IBAction)openSettings:(id)senderId
{
    _settingsWindow = [[Settings alloc] initWithWindowNibName:@"Settings"];
    [_settingsWindow showWindow:self];
}

AppDelegate.m中,而不是Settings.m