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
相关产品推荐
相关产品推荐

