iOS设置rootViewController更新页面后底部TabBar消失问题咨询
问题产生原因
代码直接修改window.rootViewController时,会将App原本的根容器(通常是UITabBarController)整体替换为孤立的PersonalViewController实例。UITabBar是UITabBarController的内置容器组件,承载TabBar的根容器被替换为普通视图控制器后,TabBar会直接消失。
解决方法
按实际业务场景选择对应方案即可:
- 场景1:仅需要切换TabBar选中项到个人页
若当前页面本身处于UITabBarController的管理体系内,无需修改根控制器,直接切换TabBar选中项即可,不会破坏原有TabBar结构:// 将索引值替换为PersonalViewController在TabBar配置中对应的实际位置 self.tabBarController?.selectedIndex = 4 - 场景2:确需整体替换根控制器且保留TabBar
不要直接将单个普通视图控制器设置为根控制器,需先初始化配置好TabBar结构的UITabBarController实例,将PersonalViewController设置为该TabBarController的子控制器/选中项,再将TabBarController设置为window的根控制器:let vc = self.storyboard?.instantiateViewController(withIdentifier: "PersonalViewController") as! PersonalViewController // 替换identifier为你自己项目中主TabBar控制器的Storyboard ID guard let tabBarVC = self.storyboard?.instantiateViewController(withIdentifier: "MainTabBarController") as? UITabBarController else { return } // 按Tab顺序传入所有子控制器,若有其他Tab页对应VC一并加入数组 tabBarVC.viewControllers = [vc] tabBarVC.selectedViewController = vc let appDlg = self.view.window!.windowScene!.delegate as? SceneDelegate appDlg?.window?.rootViewController = tabBarVC - 场景3:仅需跳转展示PersonalViewController,无需修改全局根控制器
普通页面跳转直接使用导航栈push或present方式实现即可,不要修改window的rootViewController属性:let vc = self.storyboard?.instantiateViewController(withIdentifier: "PersonalViewController") as! PersonalViewController // push跳转默认保留底部TabBar,如需push后隐藏可设置vc.hidesBottomBarWhenPushed = true self.navigationController?.pushViewController(vc, animated: true)
非必要场景不要直接修改
window.rootViewController属性,该属性对应App全局最顶层的容器控制器,随意替换会破坏原有页面容器结构,导致导航栏、TabBar等容器组件异常丢失。
内容的提问来源于stack exchange,提问作者Mariam Sargsyan
相关产品推荐
相关产品推荐

