我使用故事板在Xcode中创建了一个Mac OS X应用程序.出于某种原因,AppDelegate中的applicationDidFinishLaunching方法是在NSViewControllers中的viewDidLoad之后调用的.与iOS应用程序一样,我认为应该在applicationDidFinishLaunching之前调用viewDidLoad? OS X应用程序中的故事板是否在应用程序完成启动之前初始化视图控制器?
我使用applicationDidFinishLaunching方法将默认设置注册到NSUserDefaults.不幸的是,在加载故事板中的视图后,会发生注册默认值.因此,当我使用viewDidLoad在每个视图控制器中设置视图时,尚未设置NSUserDefaults中的默认数据.如果我不能使用applicationDidFinishLaunching在OS X故事板应用程序中注册NSUserDefaults,那么我如何在调用viewDidLoad之前设置默认值?
为了解决这个问题,在Xcode的Main.storyboard中,我关闭了主窗口的“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) } }
该应用程序不会崩溃,但现在窗口永远不会出现.下图显示了我正在使用的故事板:
解决方法
正确的是,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];
这假设您已经将“Main Interface”更改为MainMenu.xib之类的内容.