我需要在我的Swift应用程序中初始化一些子系统。不幸的是,视图控制器是在AppDelegate之前初始化的。在哪里可以将只需要在启动时运行一次的代码放在哪里?
我尝试了application(_:didFinishLaunchingWithOptions :),但在ViewController初始化之后调用了它。
尝试快速调试ViewController并将其设置为初始View Controller时,会发生此问题。
复制步骤: 在下面的两行*上放置一个断点。 在AppDelegate .didFinishLaunchingWithOptions之前命中MyTableViewController.init
class MyTableViewController: UITableViewController
required init?(coder aDecoder: NSCoder) {
*** print("init coder style")
super.init(coder: aDecoder)
}
... AppDelegate ...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
*** UIApplication.shared.isIdleTimerDisabled = true
return true
}
答案 0 :(得分:2)
最简单的方法是将其放在AppDelegate
中。您可以为此使用application(_:didFinishLaunchingWithOptions:)
函数。
如果要进行大量设置,则可能要为此创建一个单独的“协调器”类,而不要使AppDelegate
混乱。
在Info.plist中使用UIMainStoryboardFile
如果您在UIMainStoryboardFile
中设置了Info.plist
键,则AppDelegate将自动加载主故事板。然后将在调用application(_:didFinishLaunchingWithOptions:)
之前初始化初始视图控制器。
解决方案是删除UIMainStoryboardFile
键,并按如下所示手动加载情节提要:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Do your setup here
let storyboard = UIStoryboard(name: "Main", bundle: nil)
guard let rootViewController = storyboard.instantiateInitialViewController() else {
fatalError("No intitial view controller configured in Main.storyboard")
}
window.rootViewController = rootViewController
window.makeKeyAndVisible()
return true
}