Not*_*ter 2 ios appdelegate swift coordinator-pattern
我一直在尝试通过使用故事板作为界面设计在 Xcode 11.2 上创建一个新应用程序来学习协调器模式。
我关注了 Paul Hudson 的这个视频,但是当需要将代码添加到 AppDelegate.swift 文件时,我在第 12 分钟卡住了。就像应用程序将启动一样,第一个视图控制器将显示但不会导航。
我应该更改什么,或者更好的是,我应该将当前代码移到哪里以使其工作?
整个项目可以在这里找到。
简而言之,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
}
Run Code Online (Sandbox Code Playgroud)
我已经看到现在window在 SceneDelegate 中,但是将那里的所有内容移动到 sceneDidConnect 方法并没有帮助。有人可以在这里启发我吗?
谢谢!
因此,必须进行一些更改才能实现此模式。首先,您应该AppDelegate在创建时将其恢复为初始格式:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
Run Code Online (Sandbox Code Playgroud)
您可以删除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()
}
Run Code Online (Sandbox Code Playgroud)
最后的变化是我删除了MainCoordinator视图控制器中的弱声明。
所以我只是用 替换了它var coordinator: MainCoordinator?,然后它就起作用了。