Swift 4:NavigationController在后续页面不显示导航栏问题求助
解决SwitchboardVC导航栏不显示的问题
这个问题的核心原因很明确:你直接把SwitchboardVC设置成了window的根视图控制器,但它并没有被包裹在UINavigationController中。之前登录后通过push跳转能正常显示导航栏,是因为LoginVC本身就在一个导航控制器的栈里,push过去的SwitchboardVC自然继承了这个导航环境。而直接设为root的话,没有导航控制器提供导航栏,自然就看不到了。
下面给你两种可行的解决方案,你可以根据自己的需求选择:
方案一:将SwitchboardVC包裹进新的UINavigationController
这是最直接的做法,修改你在didFinishLaunchingWithOptions中的代码,把SwitchboardVC放到导航控制器里再设置为根视图:
if Auth.auth().currentUser != nil { let mainStoryBoard: UIStoryboard = UIStoryboard(name:"Main", bundle:nil) let nextView: SwitchboardVC = mainStoryBoard.instantiateViewController(withIdentifier: "SwitchboardVC") as! SwitchboardVC // 用导航控制器包裹SwitchboardVC let navController = UINavigationController(rootViewController: nextView) // 如果你的LoginVC所在的导航控制器有自定义样式(比如导航栏颜色、标题字体),记得给这个新导航控制器同步设置 // navController.navigationBar.barTintColor = .yourColor // navController.navigationBar.titleTextAttributes = [.font: UIFont.systemFont(ofSize: 18, weight: .semibold)] self.window?.rootViewController = navController }
方案二:复用原有的导航控制器(推荐)
如果你的初始根视图控制器就是LoginVC所在的UINavigationController,那可以直接替换这个导航控制器的视图控制器栈,这样能保留你之前对导航栏的所有自定义设置,不用重复配置:
if Auth.auth().currentUser != nil { let mainStoryBoard: UIStoryboard = UIStoryboard(name:"Main", bundle:nil) let nextView: SwitchboardVC = mainStoryBoard.instantiateViewController(withIdentifier: "SwitchboardVC") as! SwitchboardVC // 尝试获取当前的根导航控制器 if let existingNavController = self.window?.rootViewController as? UINavigationController { // 替换导航栈,直接显示SwitchboardVC,动画设为false避免不必要的过渡 existingNavController.setViewControllers([nextView], animated: false) } else { // 兜底:如果根不是导航控制器,再创建新的 let navController = UINavigationController(rootViewController: nextView) self.window?.rootViewController = navController } }
两种方案都能解决导航栏不显示的问题,方案二更适合需要保持导航栏样式统一的场景。
内容的提问来源于stack exchange,提问作者jgravois
相关产品推荐
相关产品推荐

