Swift中Present视图控制器时如何显示底部标签栏?
问题原因与解决方案
首先得说清楚你遇到的问题根源:你现在用present方法来模态展示新的控制器,这种方式会把当前整个TabBarController的视图都覆盖掉,所以底部TabBar自然就消失了——哪怕你设置了.fullScreen,本质上还是模态层级的覆盖,和TabBar的显示逻辑冲突了。
要实现保留底部TabBar的需求,分两种场景给你解决方案:
场景1:MoreViewController是TabBar的已有tab页面
如果这个MoreViewController本来就是你底部TabBar里的某一个标签对应的页面,那最直接的方式就是切换TabBar的选中项,而不是用present:
// 找到当前的TabBarController,切换到对应索引的tab if let tabBarVC = self.tabBarController { // 这里填MoreViewController对应的tab索引,比如是第4个tab就写3(索引从0开始) tabBarVC.selectedIndex = 3 }
这种方式完全复用已有TabBar的结构,TabBar会正常保留,页面切换也符合用户预期。
场景2:MoreViewController不是TabBar的已有tab页面
如果这个页面是需要在当前导航栈里展示,同时保留TabBar,那应该用push方法而非present,前提是当前控制器本身处于TabBarController下属的NavigationController栈中:
let moreVC = self.storyboard?.instantiateViewController(withIdentifier: "MoreViewController") as! MoreViewController // 推入当前导航栈,TabBar会自动保留 self.navigationController?.pushViewController(moreVC, animated: true)
push操作只会在当前导航栈里添加新页面,不会影响上层TabBarController的显示,所以TabBar会一直保留。
另外补充个小检查:可以去Storyboard里查看MoreViewController的Extend Edges设置,确保Under Bottom Bars是勾选状态,这样页面内容不会被TabBar遮挡,显示更合理。
内容的提问来源于stack exchange,提问作者김민식
相关产品推荐
相关产品推荐

