Objective c (OSX/Cocoa)如何设置主窗口的控制器

Objective c (OSX/Cocoa)如何设置主窗口的控制器,objective-c,xcode,macos,cocoa,nswindowcontroller,Objective C,Xcode,Macos,Cocoa,Nswindowcontroller,我已经使用.xib文件创建了一个新的cocoa应用程序(不是故事板,该应用程序必须与mavericks/mountain lion向后兼容),我希望主窗口有一个自定义windowcontroller。这可能吗?我似乎找不到将窗口连接到所需自定义控制器的方法。该窗口在AppDelegate中有一个引用出口,但是我需要一个用于此窗口的自定义NSWindowController,因为它不会在应用程序启动时打开。应用程序作为菜单栏应用程序以静默方式启动,主应用程序通过菜单栏下拉菜单中的按钮按下启动 有没

我已经使用.xib文件创建了一个新的cocoa应用程序(不是故事板,该应用程序必须与mavericks/mountain lion向后兼容),我希望主窗口有一个自定义windowcontroller。这可能吗?我似乎找不到将窗口连接到所需自定义控制器的方法。该窗口在AppDelegate中有一个引用出口,但是我需要一个用于此窗口的自定义NSWindowController,因为它不会在应用程序启动时打开。应用程序作为菜单栏应用程序以静默方式启动,主应用程序通过菜单栏下拉菜单中的按钮按下启动

有没有办法将控制器链接到interface builder中的窗口?或者我必须按照以下思路做一些事情:

 wc = [[CustomWindowController alloc] initWithWindowNibName:@"Main"];

谢谢

创建控制器并使其从NSWindowController扩展。 在xib文件中,选择文件的所有者并将其设置为自定义类。 选择NSWindow并将其连接到文件的所有者

要打开窗口,请执行以下操作:

在您的.h中:

@property (strong, nonatomic) YourWindowController *yourWinController;
在您的.m中:

self.yourWinController = [[YourWindowController alloc] initWithWindowNibName:@"YourWindowController"];
[self.yourWinController showWindow: nil];

是的,在Interface Builder中打开
实用程序(右面板),并在底部单击
对象库
(圆圈中有正方形)。
搜索
对象
(蓝色立方体),并将其拖动到
文档大纲
(interface builder左侧的面板)
从那里,选择刚刚创建的对象,并将
标识检查器中的
类更改为所需的窗口控制器

最后,您可以进入
连接检查器
并将
窗口
连接到
窗口
出口

我似乎找不到办法将窗口连接到我想要的自定义窗口 控制器。但是,该窗口在AppDelegate中有一个引用出口 我需要此窗口的自定义NSWindowController,因为它无法打开 在应用程序启动时

另一种方式:

1) 删除MainMenu.xib中的窗口。删除AppDelegate.m中的窗口属性--因为您删除了该窗口,所以它不再相关

2) 文件>新建>文件>Cocoa类。输入类名,例如MainWindowController;选择“子类:NSWindowController”;选中“还为用户界面创建.xib文件”

3) 在AppDelegate.m中创建一个出口:

#import "AppDelegate.h"
#import "MainWindowController.h"

@interface AppDelegate ()

@property (strong, nonatomic) MainWindowController* windowController;

@end
- (void)launchWindow:(id)sender {
    [self setWindowController:[[MainWindowController alloc]
                               initWithWindowNibName:@"MainWindowController"]];

    [[self windowController] showWindow:nil];
}
4) 在AppDelegate.h中声明操作:

@interface AppDelegate : NSObject <NSApplicationDelegate>

-(IBAction)launchWindow:(id)sender;

@end

5) 在MainMenu.xib中,将菜单项连接到launchWindow()操作:控制从菜单项到AppDelegate对象的拖动,然后选择launchWindow。

我不确定这是否适用于我的情况,因为我说的是使用空应用程序创建的“MainMenu.xib”。当前文件所有者的类型为NSApplication。将其设置为NSWindowController不会导致问题吗?您上面提到的是我为只包含窗口的.xib文件所做的工作。但是MainMenu.xib也包含其他对象。为什么不为您的窗口创建一个单独的xib?但是我可以,然后我必须复制菜单栏左上角显示的菜单等所有内容。我只需要一种简单的方法,从AppDelegate之外的某个按钮单击启动此主窗口。我想您无法在NSApplication(MainMenu.xib的文件所有者)和nib之间获取NSWindowController。这起作用,但不允许我按如下方式实例化窗口:mainAppController=[[Testcontroller alloc]initWithWindowNibName:@“MainMenu”];[mainAppController显示窗口:自我];我收到以下错误:无法将(委托)出口从(Testcontroller)连接到(AppDelegate):缺少setter或实例变量mainAppController是局部变量吗?根据你的代码片段,看起来是这样的。尝试创建如下属性(实例变量):
@property Testcontroller*mainAppController
。然后使用self.mainAppController引用它。还将
nil
作为参数传递给
-showWindow
。最后,确保文件的所有者(应用程序代理)不再连接到窗口。单击文件的所有者,转到连接检查器并确保删除该连接这不会将窗口设置为
main窗口