Swift 5 应用协调器模式导致黑屏
Swift 5 Applying coordinator pattern results in blank screen
在我的 AppDelegate 中我有这个:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
let rootNavController = UINavigationController()
appCoordinator = AppCoordinator(withRootController: rootNavController)
appCoordinator.start()
window?.rootViewController = rootNavController
window?.makeKeyAndVisible()
return true
}
然后在我的 AppCoordinator 中,我有这个:
final class AppCoordinator {
var rootController: UINavigationController
let initialViewController: UIViewController
init(withRootController: UINavigationController) {
self.rootController = withRootController
initialViewController = InitialViewController()
}
}
extension AppCoordinator: Coordinator {
func start() {
//rootController.show(rootController, sender: self)
rootController.pushViewController(initialViewController, animated: false)
}
}
但是当我 运行 它时,我只看到黑屏。这种模式曾经在 Swift 3 中为我工作,但我无法弄清楚我在 Swift 5 中做错了什么。
我删除了 Main.storyboard 并从 info.plist 中删除了所有对它的引用。
这是因为属性的初始化顺序。
let rootNavController = UINavigationController()
appCoordinator = AppCoordinator(withRootController: rootNavController)
appCoordinator.start()
现阶段;您已经调用了 appCoordinator
开始,但是您的 window
没有对 rootViewController
的引用;这是稍后完成的。
window?.rootViewController = rootNavController
window?.makeKeyAndVisible()
如果您在 appCoordinator.start()
调用之前移动到这两行之上,问题就会得到解决。
想通了。
Apple 已经将相当多的启动逻辑从 AppDelegate 移到了 SceneDelegate,所以我只是将我的代码移到那里,它就起作用了。
在我的 AppDelegate 中我有这个:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
let rootNavController = UINavigationController()
appCoordinator = AppCoordinator(withRootController: rootNavController)
appCoordinator.start()
window?.rootViewController = rootNavController
window?.makeKeyAndVisible()
return true
}
然后在我的 AppCoordinator 中,我有这个:
final class AppCoordinator {
var rootController: UINavigationController
let initialViewController: UIViewController
init(withRootController: UINavigationController) {
self.rootController = withRootController
initialViewController = InitialViewController()
}
}
extension AppCoordinator: Coordinator {
func start() {
//rootController.show(rootController, sender: self)
rootController.pushViewController(initialViewController, animated: false)
}
}
但是当我 运行 它时,我只看到黑屏。这种模式曾经在 Swift 3 中为我工作,但我无法弄清楚我在 Swift 5 中做错了什么。
我删除了 Main.storyboard 并从 info.plist 中删除了所有对它的引用。
这是因为属性的初始化顺序。
let rootNavController = UINavigationController()
appCoordinator = AppCoordinator(withRootController: rootNavController)
appCoordinator.start()
现阶段;您已经调用了 appCoordinator
开始,但是您的 window
没有对 rootViewController
的引用;这是稍后完成的。
window?.rootViewController = rootNavController
window?.makeKeyAndVisible()
如果您在 appCoordinator.start()
调用之前移动到这两行之上,问题就会得到解决。
想通了。
Apple 已经将相当多的启动逻辑从 AppDelegate 移到了 SceneDelegate,所以我只是将我的代码移到那里,它就起作用了。