Swift:如何在导航栈内视图控制器跳转时隐藏Tab Bar?
解决方案:Push跳转时隐藏TabBar,同时保留返回按钮
你遇到的问题其实很常见,核心是既要保留导航栈的返回逻辑(自带返回按钮),又要在详情页隐藏底部TabBar。模态跳转之所以没有返回按钮,是因为它会创建一个独立的导航上下文,而push跳转是在原导航栈中添加页面,天然自带返回按钮,只要做一点小配置就能隐藏TabBar。下面给你两种具体实现方式:
方式1:通过Segue跳转时配置
如果你是用Storyboard里的Show Segue连接Cell和InvoiceDetailVC,只需要在InvoiceVC的prepare(for segue:sender:)方法里给目标控制器设置hidesBottomBarWhenPushed属性:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "你的Segue标识符" { if let detailVC = segue.destination as? InvoiceDetailVC { // 关键配置:跳转后隐藏底部TabBar detailVC.hidesBottomBarWhenPushed = true } } }
这样跳转后,InvoiceDetailVC底部的TabBar会自动隐藏,同时导航栏上会保留默认的返回按钮,点击就能回到InvoiceVC,此时TabBar又会重新显示(包括原来的红色角标)。
方式2:纯代码Push跳转
如果是用代码手动push跳转(比如在tableView(_:didSelectRowAt:)方法里),直接在push前设置目标VC的属性即可:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let detailVC = InvoiceDetailVC() // 或者从Storyboard实例化 detailVC.hidesBottomBarWhenPushed = true navigationController?.pushViewController(detailVC, animated: true) }
额外说明
- 为什么这个属性有效?
hidesBottomBarWhenPushed是UIViewController的自带属性,只要在push前设置为true,当该控制器被推入导航栈时,底部的TabBar会自动隐藏;当从该控制器pop回来时,TabBar又会自动恢复显示,完全不需要手动控制显示/隐藏状态。 - 关于红色角标:这个配置不会影响InvoiceVC的TabBar角标,返回后角标会正常显示,符合你的需求。
如果之前尝试模态跳转后想保留返回按钮,其实也可以手动添加,但这种方式会破坏原生导航栈的逻辑,不如push方案优雅,所以更推荐上面的两种push配置方式。
内容的提问来源于stack exchange,提问作者Agung
相关产品推荐
相关产品推荐

