重新进入UITabBarController后UINavigationBar不显示的问题咨询
解决iOS 11.0-11.2中UITabBarController作为导航根VC时导航栏消失的问题
我之前做项目的时候刚好碰到过这个奇葩问题,确实是iOS 11早期版本的一个系统bug,只在11.0到11.2这几个版本里出现。下面是几个亲测有效的修复方法:
方案一:在TabBarController子类中强制恢复导航栏显示
给你的UITabBarController写个子类,重写viewWillAppear(_:)方法,每次控制器出现在界面上时,主动把导航栏设为可见:
class CustomTabBarController: UITabBarController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 只针对出问题的iOS版本做处理,不影响其他版本 if #available(iOS 11.0, *), ProcessInfo().operatingSystemVersion.majorVersion == 11, ProcessInfo().operatingSystemVersion.minorVersion <= 2 { navigationController?.setNavigationBarHidden(false, animated: animated) } } }
这里的版本判断更精准,只会在iOS11.0-11.2版本执行这段修复代码,避免干扰其他正常版本的导航栏逻辑。
方案二:Tab切换时同步修复导航栏状态
如果你的项目里有自定义Tab切换的逻辑,也可以在TabBarController的代理方法里处理:
extension CustomTabBarController: UITabBarControllerDelegate { func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { // 每次切换Tab时确保导航栏是显示的 if #available(iOS 11.0, *), ProcessInfo().operatingSystemVersion.majorVersion == 11, ProcessInfo().operatingSystemVersion.minorVersion <= 2 { navigationController?.setNavigationBarHidden(false, animated: true) } } }
别忘了在TabBarController的初始化或者viewDidLoad里设置self.delegate = self哦。
方案三:明确设置导航栏半透明属性(辅助方案)
有些情况下,导航栏的半透明属性未明确设置也会触发这个bug,你可以在创建导航控制器的时候主动设置:
let tabBarVC = CustomTabBarController() // 添加你的三个子VC到tabBarVC... let navController = UINavigationController(rootViewController: tabBarVC) // 明确设置半透明属性,不管是true还是false,避免系统默认值导致的问题 navController.navigationBar.isTranslucent = false
这个方法不是万能的,但在某些场景下能和前两个方案配合,彻底解决问题。
问题根源
这个bug的本质是iOS 11.0-11.2版本中,当你切换到非第一个Tab后退出TabBarController,再次进入时系统没有正确恢复导航栏的isHidden状态,导致导航栏被错误地隐藏了。我们通过主动强制设置导航栏可见,就能覆盖系统的错误状态,让导航栏正常显示。
内容的提问来源于stack exchange,提问作者lypw2009
相关产品推荐
相关产品推荐

