OS X故事板在applicationDidFinishLaunching之前调用viewDidLoad

wig*_*ing 9 macos xcode cocoa nsstoryboard

我使用故事板在Xcode中创建了一个Mac OS X应用程序.出于某种原因,在NSViewControllers中applicationDidFinishLaunching调用AppDelegate viewDidLoad中的方法.和iOS应用程序一样,我认为viewDidLoad以前应该调用它applicationDidFinishLaunching?OS X应用程序中的故事板是否在应用程序完成启动之前初始化视图控制器?

我正在使用该applicationDidFinishLaunching方法将默认设置注册到NSUserDefaults.不幸的是,在加载故事板中的视图之后,会发生注册默认值.因此,当我使用时在每个视图控制器中设置视图时,viewDidLoad尚未设置NSUserDefaults中的默认数据.如果我不能applicationDidFinishLaunching在OS X故事板应用程序中注册NSUserDefaults,那么我之前如何设置默认值viewDidLoad

为了解决这个问题,在Main.storyboardXcode中,我关闭了主窗口的"Is Initial Controller".我将故事板ID分配给主窗口为"MainWindow".然后在AppDelegate中输入以下代码:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(aNotification: NSNotification) {

        let storyboard = NSStoryboard(name: "Main", bundle: nil)
        let mainWindow = storyboard.instantiateControllerWithIdentifier("MainWindow") as! NSWindowController
        mainWindow.showWindow(nil)
        mainWindow.window?.makeKeyAndOrderFront(nil)

    }
}
Run Code Online (Sandbox Code Playgroud)

该应用程序不会崩溃,但现在窗口永远不会出现.下图显示了我正在使用的故事板:

在此输入图像描述

Aar*_*ron 8

正确的是,OS X中的生命周期略有不同.

您可以设置MainMenu xib文件并将其指定为主界面,然后在AppDelegate中的applicationDidFinishLaunching方法中以编程方式设置,而不是让故事板成为您的初始界面(这在项目的常规设置中定义).完成其他初始化代码后,实例化您的故事板.

我建议你查看OS X的Cocoa Programming:Big Nerd Ranch Guide如果你还没有; 他们在书中做的一件好事实际上是你摆脱了一些默认的Xcode模板的东西,而是他们让你通过明确地做"正确"的方式设置你的初始视图控制器.

你可以在你的applicationDidFinishLaunching中加入这样的东西:

NSStoryboard *mainStoryboard = [NSStoryboard storyboardWithName:@"Main" bundle:nil];
    MyWindowController *initialController = (MyWindowController *)[mainStoryboard instantiateControllerWithIdentifier:@"myWindowController"];
    [initialController showWindow:self];
    [initialController.window makeKeyAndOrderFront:self];
Run Code Online (Sandbox Code Playgroud)

这假设您已经将"Main Interface"更改为MainMenu.xib之类的内容.

  • 生命周期不同,但这种差异的合理性是什么?Xcode为模板中的applicationDidFinishLaunching设置了一个存根,就好像它应该被使用一样 - 如果没有初始化应用程序,这个方法的用例是什么? (2认同)