我一直在尝试通过使用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方法上没有帮助。
有人可以在这里启发我吗?
谢谢!
答案 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