App启动时UITabBarItem未激活,如何设置使其启动即激活?
解决UITabBarItem启动时未激活的问题
我之前也踩过这个一模一样的坑!启动时第一个TabBarItem看起来没激活,点一下就正常了,主要是因为TabBarItem的设置时机或者选中状态的触发顺序有问题,给你几个靠谱的解决办法:
方法1:提前设置TabBarItem(推荐)
不要等到viewDidLoad里再给ViewController设置TabBarItem,而是在创建ViewController实例的时候就配置好。这样TabBarController初始化时就能拿到完整的TabBarItem信息,正确渲染选中状态:
// 创建TodayViewController实例时直接设置TabBarItem let todayViewController = TodayViewController() todayViewController.tabBarItem = UITabBarItem( title: "Today", image: #imageLiteral(resourceName: "TodayTabBarItem").withRenderingMode(.alwaysOriginal), selectedImage: #imageLiteral(resourceName: "SunTabBarItemSelected").withRenderingMode(.alwaysOriginal) ) // 同理处理ForecastViewController let forecastViewController = ForecastViewController() forecastViewController.tabBarItem = UITabBarItem( title: "Forecast", image: #imageLiteral(resourceName: "ForecastTabBarItem").withRenderingMode(.alwaysOriginal), selectedImage: #imageLiteral(resourceName: "ForecastTabBarItemSelected").withRenderingMode(.alwaysOriginal) ) // 再配置TabBarController let tabBarController = UITabBarController() tabBarController.viewControllers = [todayViewController, forecastViewController] window.rootViewController = tabBarController window.makeKeyAndVisible() // 默认selectedIndex就是0,这里可以不用额外设置,如果还是有问题可以加上: // tabBarController.selectedIndex = 0
这里加withRenderingMode(.alwaysOriginal)是为了避免系统把图片当成模板渲染导致颜色失真,确保你的选中/未选中图片能正确显示原本的样子。
方法2:调整selectedIndex的设置顺序
如果不想改TabBarItem的设置时机,可以试试把selectedIndex的设置移到设置viewControllers之后,设置rootViewController之前,让TabBarController在被添加到窗口前就确认好选中状态:
let tabBarController = UITabBarController() tabBarController.viewControllers = [todayViewController, forecastViewController] tabBarController.selectedIndex = 0 // 先设置选中索引 window.rootViewController = tabBarController window.makeKeyAndVisible()
方法3:强制刷新选中状态
如果上面两种方法都没生效,可以在窗口激活后,手动指定选中的TabBarItem,强制触发渲染:
window.makeKeyAndVisible() // 手动选中第一个item tabBarController.tabBar.selectedItem = tabBarController.tabBar.items?.first
为什么会出现这个问题?
大概率是你在ViewController的viewDidLoad里设置TabBarItem,而此时TabBarController已经完成了初始渲染,系统没有自动更新第一个Item的选中状态。提前设置TabBarItem能让TabBarController在初始化阶段就获取到正确的Item配置,自然就能正确显示激活状态了。
内容的提问来源于stack exchange,提问作者Alexey Shvachka
相关产品推荐
相关产品推荐

