Objective c 是否可以在启动时使用自定义NSWindowController?

Objective c 是否可以在启动时使用自定义NSWindowController?,objective-c,interface-builder,nswindowcontroller,Objective C,Interface Builder,Nswindowcontroller,答案是,通过从main menu.xib中删除窗口并从applicationdFinishLaunching:中“手动”实例化窗口控制器,可以拥有自定义NSWindowController。但它也说: 要停止显示默认窗口,我只需删除它。也许有更好的办法,但我不知道 有更好的办法吗?如果存在,那更好的方法是什么?获取自己的窗口控制器是否被视为“正常”做法?要做到这一点,您通常需要在nib中将NSWindowController子类化,并将文件的所有者类更改为WindowController子类 编

答案是,通过从main menu.xib中删除窗口并从
applicationdFinishLaunching:
中“手动”实例化窗口控制器,可以拥有自定义NSWindowController。但它也说:

要停止显示默认窗口,我只需删除它。也许有更好的办法,但我不知道


有更好的办法吗?如果存在,那更好的方法是什么?获取自己的窗口控制器是否被视为“正常”做法?

要做到这一点,您通常需要在nib中将NSWindowController子类化,并将文件的所有者类更改为WindowController子类

编辑:

如果您不是在开发基于文档的应用程序,而只是希望自己的NSWindowController按需加载nib(完全合理),那么您应该从nib中删除该窗口,并以编程方式实例化一个
NSWindowController
子类,显式使用它来加载窗口

@implementation MyApplicationDelegate {
    MyWindowControllerSubclass *windowController;
}


-(void)applicationDidFinishLaunching:(NSNotification *)notification {
    windowController = [[MyWindowControllerSubclass alloc] initWithWindowNibName:@"MyWindowNib"];

    [windowController showWindow:nil];
    [windowController.window makeKeyAndOrderFront:nil];
}

我实际上找到了另一种方法:
NSWindowController
具有方法
-initWithWindow:
。由于应用程序代理有一个属性
窗口
,该属性在启动时从
主菜单.xib
链接到窗口,因此很容易将其链接到我的WindowController:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    MyWindowController *wincon = [[MyWindowController alloc] initWithWindow:window];
}

我还没有对此进行研究,但没有发现任何错误。

我遇到了同样的问题,我想向您展示我自己的解决方案

  • 创建一个普通的Cocoa应用程序(不是基于文档的)
  • 转到MainMenu.xib删除窗口
  • 继续创建一个新文件,用户界面->窗口
  • 然后创建NSWindowController的子类
  • 打开刚刚创建的xib文件,并将Identity inspector中的自定义类设置为刚刚创建的NSWindowController子类
  • 右键单击文件的所有者并将窗口属性连接到实际窗口
  • 现在转到AppDelegate,创建一个保存CustomWindowController的实例变量
  • 最后一件事是实例化CustomWindowController
    self.CustomWindowController=[[AccountWindowController alloc]initWithWindowNibName:@“CustomWindow”]并在
    -(void)applicationdFinishLaunching:(NSNotification*)通知中显示窗口
    [self.customWindowController showWindow:nil]

  • 下面是一个示例项目

    遗憾的是,这不起作用。最初的所有者是NSApplication,当您更改它时,会收到2条警告。窗口确实出现了,但是我的窗口控制器的
    initWithWindow:
    没有被调用,正如
    awakeFromNib
    一样……对不起,您没有更改MainMenu中的子类。nib,您在文档的nib中更改了它。我假设你正在做一个基于文档的应用程序,我认为你甚至没有得到一个NSWindowController来替换,否则,不是默认情况下。如果你不是在做一个基于文档的应用程序,那么最好的办法就是删除样板窗口,在ApplicationIDFinishLaunching:中安装一个你自己设计的NSWindowController子类,并使用它以编程方式从单独的窗口样板nib加载你的窗口。不,它不是一个基于文档的应用程序。那我就这么做!谢谢虽然我很感激你花时间回答,但这是伊鲁瓦卡普拉回答的翻版。你完全正确。我没看见!我在这里也做了同样的事情,我觉得我回答得很快。不过你的回答更有用,因为它提供了一步一步的指导