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

问题描述 投票:0回答:1

我一直在尝试通过使用 Storyboards 作为界面设计在 Xcode 11.2 上创建一个新应用程序来学习协调器模式。
我关注了 Paul Hudson 的这个视频,但在第 12 分钟需要将代码添加到 AppDelegate.swift 文件时,我陷入了困境。就像应用程序将启动一样,第一个视图控制器将显示,但不会导航。
我应该更改什么,或者更好的是,我应该将当前代码移到哪里才能使其工作?
整个项目可以在这里找到。
简而言之,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 方法并没有帮助。 有人可以在这里启发我吗?

谢谢!

ios swift appdelegate coordinator-pattern
1个回答
9
投票

因此必须进行一些更改才能实现此模式。首先,您应该将

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?
,然后就成功了。

参考文章:Xcode 11 和 iOS 13 中的场景委托

© www.soinside.com 2019 - 2024. All rights reserved.