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

如何为UITabBarController中重复引用的同个Storyboard设置不同UITabBarItem?

解决同一个Storyboard引用在TabBar中显示不同图标的问题

我太懂这种困扰了——用同一个外部Storyboard的引用做TabBar的两个条目,想设置不同图标却要么不生效,要么连标签栏都没了。核心原因是:Storyboard引用加载的控制器会优先使用自身内部配置的UITabBarItem,如果原Storyboard里没设置,系统也不会自动套用TabBarController的默认配置。下面给你两种靠谱的解决办法:

方法一:通过代码在TabBarController中手动设置

这种方法最灵活,完全不受外部Storyboard的限制,也是我最推荐的:

  1. 先把你的BookTable Storyboard里的根控制器TabBarItem清空(如果之前设置过,直接在Attributes Inspector里删掉标题和图标);
  2. 在你的UITabBarController代码里,重写viewDidLoad方法,为前两个子控制器分别配置自定义的TabBarItem:

Swift 版本

override func viewDidLoad() {
    super.viewDidLoad()
    
    // 安全获取前两个子控制器
    guard let firstTabVC = viewControllers?[0], let secondTabVC = viewControllers?[1] else {
        return
    }
    
    // 第一个标签的配置(示例,你可以换成自己的图标和标题)
    firstTabVC.tabBarItem = UITabBarItem(
        title: "我的书架",
        image: UIImage(systemName: "book"),
        selectedImage: UIImage(systemName: "book.fill")
    )
    
    // 第二个标签的配置
    secondTabVC.tabBarItem = UITabBarItem(
        title: "发现书籍",
        image: UIImage(systemName: "magnifyingglass"),
        selectedImage: UIImage(systemName: "magnifyingglass.circle.fill")
    )
}

Objective-C 版本

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIViewController *firstTabVC = self.viewControllers[0];
    UIViewController *secondTabVC = self.viewControllers[1];
    
    // 第一个标签的配置
    firstTabVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"我的书架"
                                                          image:[UIImage systemImageNamed:@"book"]
                                                  selectedImage:[UIImage systemImageNamed:@"book.fill"]];
    
    // 第二个标签的配置
    secondTabVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"发现书籍"
                                                          image:[UIImage systemImageNamed:@"magnifyingglass"]
                                                  selectedImage:[UIImage systemImageNamed:@"magnifyingglass.circle.fill"]];
}

方法二:在主Storyboard中为Storyboard引用配置TabBarItem(部分场景生效)

如果不想写代码,可以试试这个可视化操作:

  • 选中TabBarController里的第一个Storyboard引用,打开Attributes Inspector;
  • 找到Tab Bar Item区域,直接设置Title、Image和Selected Image;
  • 对第二个Storyboard引用重复同样操作,设置不同的内容。

⚠️ 注意:如果外部Storyboard里的控制器已经设置了TabBarItem,这个方法会被覆盖,所以还是方法一更稳定。

最后排查小技巧:如果运行后还是不显示标签栏,检查下TabBarController的viewControllers是否正确关联了两个Storyboard引用,同时确保外部Storyboard的根控制器没有写hidesBottomBarWhenPushed = YES这类隐藏TabBar的代码。

内容的提问来源于stack exchange,提问作者Andrew Bennet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:20:28