gpt4 book ai didi

xcode - OS X Storyboard 在 applicationDidFinishLaunching 之前调用 viewDidLoad

转载 作者:行者123 更新时间:2023-12-03 16:04:40 24 4
gpt4 key购买 nike

我使用 Storyboard 在 Xcode 中创建了一个 Mac OS X 应用程序。由于某种原因,AppDelegate 中的 applicationDidFinishLaunching 方法在 NSViewController 中的 viewDidLoad 之后被调用。与 iOS 应用程序一样,我认为 viewDidLoad 应该在 applicationDidFinishLaunching 之前调用? OS X 应用程序中的 Storyboard 会在应用程序完成启动之前初始化 View Controller 吗?

我正在使用 applicationDidFinishLaunching 方法将默认设置注册到 NSUserDefaults 中。不幸的是,注册默认值是在 Storyboard中的 View 加载之后发生的。因此,当我使用 viewDidLoad 在每个 View Controller 中设置 View 时,NSUserDefaults 中的默认数据尚未设置。如果我无法使用 applicationDidFinishLaunching 在 OS X Storyboard 应用中注册 NSUserDefaults,那么如何在调用 viewDidLoad 之前设置默认值?

为了解决此问题,在 Xcode 的 Main.storyboard 中,我关闭了主窗口的“Is Initial Controller”。我将 Storyboard 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)

}
}

应用程序不会崩溃,但现在窗口永远不会出现。下图显示了我正在使用的 Storyboard:

enter image description here

最佳答案

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

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

如果您还没有阅读过OS X 的 Cocoa 编程:The Big Nerd Ranch Guide,我建议您查看一下;他们在书中做的一件好事实际上是让你摆脱一些默认的 Xcode 模板内容,而是让你通过明确地以“正确”的方式设置你的初始 View Controller 。

您可以在 applicationDidFinishLaunching 中添加类似的内容:

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

这假设您已经将“主界面”更改为类似 MainMenu.xib 的内容。

关于xcode - OS X Storyboard 在 applicationDidFinishLaunching 之前调用 viewDidLoad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36681587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com