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
}