我没有像这样使用故事板和设置 sceneDelegate
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
let vc = A_ViewController()
let window = UIWindow(windowScene: windowScene)
window.rootViewController = vc
window.makeKeyAndVisible()
self.window = window
}
在此代码中,导航控制器未初始化。而且,如果我像这样在 A_ViewController 中调用导航控制器:
print(self?.navigationController)
它打印“nil”。并且,无法导航到其他 ViewController。
这是有道理的,因为我没有初始化导航控制器。
如果像这样编辑 sceneDelegate 代码:
let rootNavigationController = UINavigationController(rootViewController: vc)
window.rootViewController = rootNavigationController
并从A_ViewController推送其他VC,然后
Pushed ViewController 有自己的导航控制器
我没有初始化推送的VC的
navigationController
。为什么推VC有navigationController
?
导航控制器是一种容器视图控制器,用于管理导航界面中的一个或多个子视图控制器
所以它是一组视图控制器而不是单个视图控制器。每当您
push
一个新控制器时,UINavigationController 中的内部 controllers
数组都会附加一个新元素。反之亦然,使用 pop
控制器将从该数组中删除。您可以假设它可能是工作流程中的 singleton
导航器,直到您呈现新的工作流程(没有新的 UINavigationController)。
您可以在文档中看到这一点。所有这些视图控制器:
Setting
、General
和 Auto-Lock
都具有相同的 UINavigationController 实例,尽管它可能在 Setting
屏幕上创建一次。