Swift 应用中的子系统初始化位置
Where to Initialize Subsystems in Swift Apps
我的 swift 应用程序中有一些子系统需要初始化。不幸的是,View Controllers 在 AppDelegate 之前被初始化。我可以在哪里放置启动时只需要 运行 一次的代码?
我尝试了 application(_:didFinishLaunchingWithOptions:) 但它是在我的 ViewController 初始化之后调用的。
尝试快速调试 ViewControllers 但将它们设置为初始视图控制器时会出现此问题。
重现步骤:
在下面的两个 *' 行上放置一个断点。
MyTableViewController.init 在 AppDelegate .didFinishLaunchingWithOptions
之前被命中
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
}
最简单的方法是将其放在 AppDelegate
中。您可以为此使用 application(_:didFinishLaunchingWithOptions:)
函数。
如果您有很多需要设置的内容,您可能需要为此创建一个单独的 "Coordinator" class,而不是让 AppDelegate
.
变得杂乱无章。
在 Info.plist
中使用 UIMainStoryboardFile
如果您在 Info.plist
中设置了 UIMainStoryboardFile
键,AppDelegate 将自动加载主故事板。这将在调用 application(_:didFinishLaunchingWithOptions:)
之前初始化初始视图控制器。
解决方法是去掉UIMainStoryboardFile
键,手动加载storyboard如下:
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
}
我的 swift 应用程序中有一些子系统需要初始化。不幸的是,View Controllers 在 AppDelegate 之前被初始化。我可以在哪里放置启动时只需要 运行 一次的代码?
我尝试了 application(_:didFinishLaunchingWithOptions:) 但它是在我的 ViewController 初始化之后调用的。
尝试快速调试 ViewControllers 但将它们设置为初始视图控制器时会出现此问题。
重现步骤: 在下面的两个 *' 行上放置一个断点。 MyTableViewController.init 在 AppDelegate .didFinishLaunchingWithOptions
之前被命中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
}
最简单的方法是将其放在 AppDelegate
中。您可以为此使用 application(_:didFinishLaunchingWithOptions:)
函数。
如果您有很多需要设置的内容,您可能需要为此创建一个单独的 "Coordinator" class,而不是让 AppDelegate
.
在 Info.plist
中使用 UIMainStoryboardFile如果您在 Info.plist
中设置了 UIMainStoryboardFile
键,AppDelegate 将自动加载主故事板。这将在调用 application(_:didFinishLaunchingWithOptions:)
之前初始化初始视图控制器。
解决方法是去掉UIMainStoryboardFile
键,手动加载storyboard如下:
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
}