我使用故事板在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)
该应用程序不会崩溃,但现在窗口永远不会出现.下图显示了我正在使用的故事板:
我的应用程序需要执行一些清理任务 - 删除本地存储的旧数据 - 每次启动时,在显示初始视图控制器之前。
这是因为初始视图控制器在初始化时加载现有数据,并将其显示在表视图中。
我设置了几个断点,并发现初始视图控制器的初始化程序 ( init?(coder aDecoder: NSCoder)) 运行之前 application(_:didFinishLaunchingWithOptions)- 甚至之前application(_:**will**FinishLaunchingWithOptions),准确地说。
我可以将清理代码放在视图控制器初始值设定项的最顶部,但我想将清理逻辑与任何特定屏幕分离。有一天,那个视图控制器可能最终不会成为最初的视图控制器。
覆盖应用程序委托的init()方法并将我的清理代码放在那里确实可以完成工作,但是......
没有更好/更优雅的方式吗?
注:供参考,相关方法的执行顺序如下:
- AppDelegate.init()
- 视图控制器.init()
- AppDelegate.application(_:willFinishLaunchingWithOptions:)
- AppDelegate.application(_:didFinishLaunchingWithOptions:)
- ViewController.viewDidLoad()
清理任务不冗长,也不需要异步运行:相反,我宁愿如果我的初始视图控制器甚至没有实例化,直到它完成(我很清楚,如果它需要的系统会杀了我的应用程序启动时间很长。但是,它只是删除了一些本地文件,没什么大不了的。)。
我问这个问题主要是因为,在故事板出现之前,应用程序启动代码如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
// INITIAL VIEW CONTROLLER GETS INSTANTIATED HERE
// (NOT BEFORE):
MyViewController* controller = …Run Code Online (Sandbox Code Playgroud)