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

iOS中UITabBar图标不显示:登录后代码创建TabBarController问题

解决UITabBar图标不显示的问题

我看了你的代码,有几个关键问题导致图标无法正常显示,咱们一步步来修复:

1. 核心错误:未将导航控制器添加到TabBarController的子控制器列表

你注释掉了tabBarVc.viewControllers = [vc1, vc2],但实际上应该把你创建的**导航控制器(nav1、nav2)**添加进去——因为你是给导航控制器设置的tabBarItem,只有把导航控制器作为TabBarController的子控制器,对应的tabBarItem才会被渲染出来。

修改这行代码:

tabBarVc.viewControllers = [nav1, nav2]

2. 图片资源命名不一致且需验证资源有效性

你第一个tabBarItem用了UIImage(named: "music.png"),第二个用了UIImage(named: "music"),命名格式不统一。同时要确认:

  • 图片资源music(或music.png)已经正确添加到项目的Assets.xcassets中,或者直接存放在bundle目录下
  • 图片的Target Membership已经勾选当前项目
  • 确保有对应的@2x、@3x分辨率图片,避免在不同设备上显示异常

建议统一使用不带后缀的命名方式:

nav1.tabBarItem = UITabBarItem(title: "Steps", image: UIImage(named: "music"), tag: 1)
nav2.tabBarItem = UITabBarItem(title: "History", image: UIImage(named: "music"), tag: 2)

3. 可选优化:更简洁的导航控制器初始化方式

你可以直接用带根视图控制器的初始化方法创建导航控制器,代码会更简洁:

let nav1 = UINavigationController(rootViewController: vc1)
let nav2 = UINavigationController(rootViewController: vc2)

修复后的完整代码

func makeTabBarController() -> Void {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc1 = storyboard.instantiateViewController(withIdentifier: "homevcID")
    // 直接用根视图控制器初始化导航控制器
    let nav1 = UINavigationController(rootViewController: vc1)
    nav1.tabBarItem = UITabBarItem(title: "Steps", image: UIImage(named: "music"), tag: 1)
    
    let vc2 = storyboard.instantiateViewController(withIdentifier: "historyvcID")
    let nav2 = UINavigationController(rootViewController: vc2)
    nav2.tabBarItem = UITabBarItem(title: "History", image: UIImage(named: "music"), tag: 2)
    
    let tabBarVc = UITabBarController()
    // 把导航控制器添加到TabBarController中
    tabBarVc.viewControllers = [nav1, nav2]
    
    // 可选的样式设置(取消注释即可生效)
    // tabBarVc.tabBar.barTintColor = .green
    // tabBarVc.tabBar.tintColor = .white
    // tabBarVc.tabBar.unselectedItemTintColor = .systemGray
    // tabBarVc.tabBar.isTranslucent = true
    
    window?.rootViewController = tabBarVc
    // 别忘了让window成为关键窗口并显示
    window?.makeKeyAndVisible()
}

另外补充一点:如果你的项目是基于SceneDelegate架构,要确保window已经正确初始化,或者在对应的场景生命周期方法中调用这个函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:07:53