从非嵌入UINavigationController的ViewController跳转至嵌入的ViewController时导航栏消失问题
问题原因与解决方案:从非导航控制器的VC B跳转至导航栏嵌套的VC A时导航栏消失
我来给你拆解一下这个问题哈,其实原因和解决方法都挺清晰的:
一、为什么导航栏会消失?
核心原因很简单:你看到的VC A的导航栏,并不是属于VC A本身的,而是来自它所在的UINavigationController。如果你直接从VC B跳转到VC A的实例(比如直接present/push A),相当于把A单独拿出来展示,它原来所属的导航控制器并没有被一起加载,自然就看不到导航栏了。
打个比方:你本来把A放在导航控制器这个“容器”里,导航栏是容器的一部分;结果你跳转的时候只拿了A出来,没带容器,那导航栏当然跟着容器留在原地了。
二、不嵌入B到导航控制器的前提下,怎么正确跳转?
根据你的跳转需求,有两种常用方案:
方案1:模态展示包含VC A的导航控制器
如果你的需求是从B以模态方式弹出A,那不要直接present VC A,而是present它所在的UINavigationController实例。代码示例如下:// 假设你已经有VC A的实例 let viewControllerA = ViewControllerA() // 把A包裹进导航控制器 let navController = UINavigationController(rootViewController: viewControllerA) // 从B模态展示这个导航控制器 self.present(navController, animated: true, completion: nil)这样展示出来的A就会带着完整的导航栏,后续你在A里做的pop操作也能正常生效。
方案2:Storyboard中用Segue跳转的场景
如果你是用Storyboard里的Segue来跳转,那不要把Segue直接连到VC A,而是连到包裹A的UINavigationController:- 在Storyboard里选中VC B,按住Control拖到A所在的导航控制器上
- 选择合适的Segue类型(比如Present Modally)
- 运行后跳转,导航栏就会正常显示了
额外提示:从A返回B的方法
因为是模态展示,你可以在A里通过下面的代码返回:self.navigationController?.dismiss(animated: true, completion: nil)或者给导航栏添加返回按钮,触发这个方法即可。
内容的提问来源于stack exchange,提问作者Paul Kahohi
相关产品推荐
相关产品推荐

