Swift 5应用协调器模式会导致黑屏

时间:2019-12-21 04:35:10

标签: swift coordinator-pattern

在我的AppDelegate中,我有这个:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    window = UIWindow(frame: UIScreen.main.bounds)

    let rootNavController = UINavigationController()
    appCoordinator = AppCoordinator(withRootController: rootNavController)
    appCoordinator.start()

    window?.rootViewController = rootNavController
    window?.makeKeyAndVisible()

return true
}

然后在我的AppCoordinator中,我有了这个:

final class AppCoordinator {

  var rootController: UINavigationController
  let initialViewController: UIViewController

  init(withRootController: UINavigationController) {
    self.rootController = withRootController
    initialViewController = InitialViewController()
  }
}

extension AppCoordinator: Coordinator {

    func start() {
        //rootController.show(rootController, sender: self)
        rootController.pushViewController(initialViewController, animated: false)
    }
}

但是当我运行它时,我只会看到黑屏。这种模式曾经在Swift 3中对我有用,但是我无法弄清楚在Swift 5中我在做什么。

我已经删除了Main.storyboard,并且还从info.plist中删除了对其的所有引用。

2 个答案:

答案 0 :(得分:0)

这是由于属性初始化的顺序。

let rootNavController = UINavigationController()
appCoordinator = AppCoordinator(withRootController: rootNavController)
appCoordinator.start()

在此阶段;您已经调用了appCoordinator开头,但是您的window没有对rootViewController的引用;稍后再做。

window?.rootViewController = rootNavController
window?.makeKeyAndVisible()

如果在appCoordinator.start()调用之前在这两行上移动,问题将得到解决。

答案 1 :(得分:0)

解决了这个问题。

Apple已将许多启动逻辑从AppDelegate移到了SceneDelegate,所以我只是将代码移到了那里,并且可以正常工作。