Tab Bar Controller内ViewController导航栏重复显示问题求助
解决导航栏重复显示的问题
看起来你遇到的是导航控制器嵌套导致的重复导航栏问题,结合你的描述和代码,我整理了几个关键的解决步骤:
1. 检查Storyboard的控制器层级结构
先确认你的界面结构是否合理:
- 如果是把Tab Bar Controller作为模态弹窗展示,正确结构应该是:
Tab Bar Controller→UINavigation Controller→SideViewController - 如果是把Tab Bar Controllerpush到现有导航栈里,千万别给它的子控制器再嵌套Navigation Controller,直接让
SideViewController作为Tab Bar的子项就行——嵌套两层导航控制器是导致重复导航栏的核心原因之一
2. 关闭ViewController自身的导航栏显示
在Storyboard里选中SideViewController,打开右侧的Attributes Inspector面板,找到并取消勾选「Shows Navigation Bar」选项。因为它已经被嵌入到Navigation Controller里了,不需要自己再单独渲染导航栏,这是新手常踩的坑。
3. 正确配置导航栏元素
在SideViewController的viewDidLoad里,直接通过navigationItem来配置导航栏的标题和按钮,不用手动创建新的导航栏。修改你的代码如下:
import UIKit class SideViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() title = "Search" // 添加右侧搜索按钮 let searchBtn = UIBarButtonItem(barButtonSystemItem: .search, target: self, action: #selector(action)) navigationItem.rightBarButtonItem = searchBtn } @objc func action(){ // 在这里添加搜索按钮的点击逻辑 print("搜索按钮被点击啦") } }
4. 调整跳转方式(关键)
如果之前是用push的方式跳转到Tab Bar Controller,建议改成present的方式,这样Tab Bar的导航栈和之前的导航栈完全分离,不会出现冲突:
在发起跳转的ViewController里,把push代码替换成:
// 假设你的Tab Bar Controller在Storyboard中的ID是"TabBarVC" if let tabBarVC = storyboard?.instantiateViewController(withIdentifier: "TabBarVC") as? UITabBarController { present(tabBarVC, animated: true, completion: nil) }
这样调整后,你的导航栏就会正常显示:包含返回按钮(模态视图会自动显示关闭按钮,也可以手动自定义)、标题「Search」和右侧的搜索按钮,不会再出现重复的问题。
内容的提问来源于stack exchange,提问作者Taka
相关产品推荐
相关产品推荐

