You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Segue到子ViewController后保留显示UITabBar?

解决UITabBarController跳转子VC时保留TabBar的问题

我刚好碰到过一模一样的场景,给你几个靠谱的解决方案,都是iOS开发里常用的套路:

方法一:给每个主VC套一层UINavigationController(最推荐)

这是Apple官方认可的标准组合方式,操作起来也最省心:

  1. 给你的4个主ViewController(包括MainVC)各自包裹一个UINavigationController
  2. 把这些导航控制器设置为UITabBarController的viewControllers数组元素
  3. 从MainVC跳转到ChildVC时,使用Show(Push)类型的Segue,或者代码里直接调用:
    self.navigationController?.pushViewController(childVC, animated: true)
    

这样跳转后,ChildVC会进入MainVC的导航栈,UITabBar会一直固定在底部显示,而且ChildVC完全不会出现在TabBar的选项里——完美匹配你的需求。

至于你之前Segue跳转后没显示TabBar,大概率是两个原因:要么直接把MainVC设为TabBar的子控制器(没套导航),要么用了Present类型的Segue(这种会完全覆盖当前视图,包括TabBar)。

方法二:手动将ChildVC添加到TabBarController的子视图层级(特殊场景用)

如果不想用导航栈,可以手动管理视图层级,但这种方式需要自己处理返回逻辑,步骤如下:

  1. 在MainVC的按钮点击事件里初始化ChildVC
  2. 执行以下代码添加子控制器:
    guard let tabBarVC = self.tabBarController else { return }
    tabBarVC.addChild(childVC)
    // 设置frame时要避开TabBar的高度
    childVC.view.frame = CGRect(x: 0, y: 0, width: tabBarVC.view.bounds.width, height: tabBarVC.view.bounds.height - tabBarVC.tabBar.bounds.height)
    tabBarVC.view.addSubview(childVC.view)
    childVC.didMove(toParent: tabBarVC)
    

这种方式能保留TabBar,但需要自己写返回按钮的逻辑(比如移除ChildVC的视图和父子控制器关系),不如导航栈省心,只推荐在特殊场景下使用。

额外注意点

  • 绝对不要把ChildVC添加到TabBarController的viewControllers数组里,不然它会出现在TabBar上,违背你的需求
  • 用Segue时一定要选**Show(Push)**类型,别选Present Modally或其他类型

内容的提问来源于stack exchange,提问作者nicksarno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:44:22