如何在UIKit的Xcode 11 / iOS13中使用协调器模式?

时间:2019-11-20 08:08:22

标签: ios swift appdelegate coordinator-pattern

我一直在尝试通过使用Storyboards作为界面设计在Xcode 11.2上创建一个新应用来学习协调器模式。
我跟随this video跟随Paul Hudson,但是当需要将代码添加到AppDelegate.swift文件时,我陷入了第12分钟的困境。就像该应用程序将启动一样,第一个视图控制器将显示但不会导航。
我应该更改什么,或者最好将当前代码移到哪里以使其起作用?
整个项目可以在here中找到。
简而言之,iOS 12及更低版本中AppDelegate中的代码是这样的:

var coordinator: MainCoordinator?
var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    let navController = UINavigationController()
    coordinator = MainCoordinator(navigationController: navController)
    coordinator?.start()

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.rootViewController = navController
    window?.makeKeyAndVisible()

    return true
}

我已经看到window现在在SceneDelegate中,但是将那里的所有内容移到sceneDidConnect方法上没有帮助。 有人可以在这里启发我吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

很抱歉,我的最初答案是,但是我已经找到了解决您问题的方法。这是由于您提到的iOS更改。

因此,必须进行一些更改才能实现此模式。首先,您应将AppDelegate恢复为创建时的初始格式:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    return true
}

您可以删除顶部的var coordinator: MainCoordinator?声明。

SceneDelegate中,将sceneWillConnectToSession函数中的代码替换为以下内容:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 
    guard let windowScene = (scene as? UIWindowScene) else { return }
    let navController = UINavigationController()
    let coordinator = MainCoordinator(navigationController: navController)
    coordinator.start()

    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = navController
    self.window = window
    window.makeKeyAndVisible()
}

最后的更改是,我在视图控制器中删除了MainCoordinator的弱声明。

所以我只用var coordinator: MainCoordinator?替换了它,然后它起作用了。

Reference Article: The Scene Delegate In Xcode 11 And iOS 13