Где инициализировать подсистемы в приложениях Swift - PullRequest
0 голосов
/ 19 января 2019

У меня есть несколько подсистем, которые мне нужно инициализировать в моем быстром приложении. К сожалению, View Controllers инициализируются до AppDelegate. Где можно разместить код, который нужно запускать только один раз при запуске?

Я пробовал приложение (_: 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
    }

1 Ответ

0 голосов
/ 19 января 2019

Самый простой способ - поместить это в AppDelegate. Для этого вы можете использовать функцию application(_:didFinishLaunchingWithOptions:).

Если вам нужно настроить многое, вы можете создать для этого отдельный класс «Координатор», а не загромождать AppDelegate.

Использование с UIMainStoryboardFile в Info.plist

Если в Info.plist установлена ​​клавиша UIMainStoryboardFile, главная раскадровка будет автоматически загружена 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
}
...