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

标签 ios swift appdelegate coordinator-pattern

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

谢谢!

最佳答案

因此必须进行一些更改才能实现此模式。首先,您应该将 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()
}

最后的更改是我删除了 View Controller 中 MainCoordinator 的弱声明。

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

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

关于ios - 如何在 UIKit 上的 Xcode 11/iOS13 中使用协调器模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58949467/

相关文章:

iOS7 - TableView 标题中的多行文本?

ios - 应用程序(_ :url:options:) is never called

ios - Obj-C applicationWillResignActive - 区分事件

android - 多相机组件react-native-camera

ios - 启用 ARC 时应用程序在 addsubview 上崩溃

ios - userNotificationCenter 中的 completionHandler 实际上做了什么?

swift - 如何检测 NSTextField 上的回车键命中

swift - 如何区分 Siri Remote 按钮按下和游戏 handle 按钮按下?

python - 在 PyObjC 中实现 openFile 的 NSApplication 委托(delegate)协议(protocol)

ios - AppDelegate 类不适用于 iOS Swift 应用程序中的 Obj-C 嵌入式库