Swift 4中如何正确隐藏TabBar?hidesBottomBarWhenPushed异常处理
问题2:如何通过hidesBottomBarWhenPushed正确隐藏TabBar,以及解决pop后TabBar永久隐藏的问题?
首先要纠正一个常见的错误用法:hidesBottomBarWhenPushed必须在push前设置给目标控制器,而不是在目标控制器内部设置。
正确的基础用法
比如你要从ViewControllerB跳转到ViewControllerA并隐藏TabBar,代码应该这么写:
let vcA = ViewControllerA() // 一定要在push操作前设置这个属性 vcA.hidesBottomBarWhenPushed = true self.navigationController?.pushViewController(vcA, animated: true)
按这个逻辑操作,push到ViewControllerA时TabBar会自动隐藏,pop回ViewControllerB时TabBar也会自动恢复显示,这是最理想的状态。
为什么会出现pop后TabBar永久隐藏的情况?
大概率是你在错误的时机设置了这个属性——比如在ViewControllerA的viewDidLoad/viewWillAppear里写了self.hidesBottomBarWhenPushed = true,或者跳转逻辑中重复设置导致状态混乱,破坏了系统的自动恢复机制。
解决办法
如果上面的正确用法还是没解决问题,可以试试以下两种兜底方案:
在返回页的
viewWillAppear中强制恢复
在ViewControllerB的viewWillAppear方法里,手动让TabBar显示,保证页面返回时的状态正确:override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 配合动画让恢复过程更自然 UIView.animate(withDuration: 0.3) { self.tabBarController?.tabBar.isHidden = false } }通过导航控制器代理统一控制(最可靠)
实现UINavigationControllerDelegate的方法,根据当前显示的控制器动态调整TabBar状态,适合复杂的导航场景:// 先给导航控制器设置代理,比如在ViewControllerB的viewDidLoad中 override func viewDidLoad() { super.viewDidLoad() self.navigationController?.delegate = self } // 实现导航控制器代理方法 func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { // 判断当前要显示的页面是否需要隐藏TabBar let shouldHideTabBar = viewController is ViewControllerA // 调整TabBar状态,动画跟随页面切换的动画状态 if animated { UIView.animate(withDuration: 0.3) { navigationController.tabBarController?.tabBar.isHidden = shouldHideTabBar } } else { navigationController.tabBarController?.tabBar.isHidden = shouldHideTabBar } }
内容的提问来源于stack exchange,提问作者p3scobar
相关产品推荐
相关产品推荐

