7

这个答案中,据说可以通过从 MainMenu.xib 中删除窗口并从applicationDidFinishLaunching:. 但它也说:

要停止显示默认窗口,我只需将其删除。可能有更好的方法,但我不知道。

没有更好的方法?有什么更好的方法,它应该存在吗?拥有自己的窗口控制器是否被认为是“正常”的做法?

4

3 回答 3

12

为此,您通常会将 NSWindowController 子类化并将 File's Owner 类更改为 nib 中的 WindowController 子类。

编辑:

如果你不是在做一个基于文档的应用程序,只是想要一个你自己的 NSWindowController 来按需加载 Nibs(完全合理),那么你会从你的 nib 中删除窗口并以NSWindowController编程方式实例化一个子类,使用它明确地做你的窗口加载......

@implementation MyApplicationDelegate {
    MyWindowControllerSubclass *windowController;
}


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

    [windowController showWindow:nil];
    [windowController.window makeKeyAndOrderFront:nil];
}
于 2013-02-07T17:58:22.303 回答
7

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

  1. 创建一个普通的 Cocoa 应用程序(基于文档)
  2. 转到 MainMenu.xib 并删除窗口
  3. 继续创建一个新文件,用户界面-> 窗口
  4. 之后创建 NSWindowController 的子类
  5. 打开刚刚创建的xib文件,将Identity inspector中的Custom Class设置为刚刚创建的NSWindowController子类
  6. 右键单击文件的所有者并将窗口属性连接到实际窗口
  7. 现在去 AppDelegate 创建一个实例变量来保存你的 CustomWindowController
  8. 您要做的最后一件事是实例化您的 CustomWindowController self.customWindowController = [[AccountWindowController alloc] initWithWindowNibName:@"CustomWindow"];[self.customWindowController showWindow:nil]- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

这是一个示例项目https://www.dropbox.com/s/ft3t7w72806tnoe/CustomWindowController.zip

于 2014-01-18T14:42:50.393 回答
0

我实际上找到了另一种方法:NSWindowController拥有方法-initWithWindow:。因为 App Delegate 有一个在启动时window链接到窗口的属性MainMenu.xib,所以很容易将它链接到我的 WindowController:

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

我还没有研究这个,但我没有得到任何错误。

于 2013-02-19T15:05:38.987 回答