iOS Tab Bar隐藏问题:跨故事板TabBarController首个标签栏不显示
我帮你梳理下实际开发中常见的原因和对应的解决办法:
原因1:加载新故事板控制器的方式错误(直接present/push而非作为TabBar子控制器)
如果你在tabBar:didSelectItem:方法里直接present或者push新故事板的控制器,会导致当前TabBarController被覆盖或者导航栈层级混乱,TabBar自然就消失了。正确做法是把新故事板里的UINavigationController作为TabBarController的子控制器之一,要么在初始化时就加入,要么懒加载替换到
viewControllers数组中:// 懒加载的示例代码 -(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { NSInteger index = [tabBar.items indexOfObject:item]; // 仅在第一次点击时加载 if (index == 0 && !self.viewControllers[index]) { UIStoryboard *newStoryboard = [UIStoryboard storyboardWithName:@"你的新故事板名称" bundle:nil]; UINavigationController *newNav = [newStoryboard instantiateInitialViewController]; newNav.tabBarItem = item; // 保证TabItem和选中的一致 NSMutableArray *updatedVCs = [self.viewControllers mutableCopy]; updatedVCs[index] = newNav; self.viewControllers = updatedVCs; } }原因2:新故事板中的ViewController开启了「Hide Bottom Bar on Push」
打开你的新故事板,选中那个普通UIViewController,在右侧Attributes Inspector面板里,找到Hide Bottom Bar on Push选项,确保它是未勾选状态。如果这个选项开启,当该控制器被导航控制器加载时,会自动隐藏底部的TabBar。也可以在代码里强制关闭:
// 在新故事板的UIViewController的viewDidLoad中添加 - (void)viewDidLoad { [super viewDidLoad]; self.hidesBottomBarWhenPushed = NO; }原因3:未正确获取新故事板中的UINavigationController
如果你不小心直接加载了新故事板里的普通UIViewController,而不是它外面包裹的UINavigationController,会导致这个VC没有被正确关联到TabBarController的层级中。确保你获取的是故事板的初始控制器(如果初始控制器是UINavigationController的话),或者通过Storyboard ID获取导航控制器:
// 方式1:获取初始控制器(前提是新故事板的初始控制器设为UINavigationController) UINavigationController *newNav = [newStoryboard instantiateInitialViewController]; // 方式2:通过Storyboard ID获取(给导航控制器设置好ID) UINavigationController *newNav = [newStoryboard instantiateViewControllerWithIdentifier:@"NewNavControllerID"];原因4:TabBarController的viewControllers数组未正确配置
检查你的TabBarController的viewControllers数组,确保第一个元素是新故事板的UINavigationController,而不是nil或者其他类型的控制器。最好在TabBarController的viewDidLoad中初始化所有子控制器,避免动态切换时的层级问题:- (void)viewDidLoad { [super viewDidLoad]; // 加载新故事板的导航控制器 UIStoryboard *newSB = [UIStoryboard storyboardWithName:@"NewStoryboard" bundle:nil]; UINavigationController *newNav = [newSB instantiateInitialViewController]; newNav.tabBarItem.title = @"首页"; // 加载其他标签的控制器(同一故事板) UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UINavigationController *nav2 = [mainSB instantiateViewControllerWithIdentifier:@"Nav2ID"]; UINavigationController *nav3 = [mainSB instantiateViewControllerWithIdentifier:@"Nav3ID"]; UINavigationController *nav4 = [mainSB instantiateViewControllerWithIdentifier:@"Nav4ID"]; // 设置所有子控制器 self.viewControllers = @[newNav, nav2, nav3, nav4]; }
按照上面的步骤排查,应该就能解决TabBar不显示的问题了。
内容的提问来源于stack exchange,提问作者Rajeev

