在Swift Apps中初始化子系统的位置

时间:2019-01-19 16:13:51

标签: ios swift initialization viewcontroller appdelegate

我需要在我的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
    }

1 个答案:

答案 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
}