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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:01:03