Swift:自定义函数禁用TabBarItem时tabBar.items数组始终为nil的问题
解决UITabBarController中tabBar.items为nil的问题
我明白你遇到的麻烦了——在viewDidLoad()里能正常操作TabBar的Item,但自己写的setTabState函数里tabBar.items却总是nil。这其实是因为**tabBar.items的初始化时机晚于你调用函数的时机**,或者说它依赖于系统内部的视图加载流程,不如直接通过控制器数组来操作更可靠。
问题根源
tabBar.items是系统根据UITabBarController的viewControllers数组里的子控制器,自动生成的对应TabBarItem集合。这个生成过程可能在viewDidLoad()之后才完成,如果你在视图还没完全初始化好的时候调用setTabState,自然会拿到nil。
更可靠的解决方案
我们可以跳过tabBar.items,直接通过viewControllers数组获取对应的子控制器,然后操作它的tabBarItem。这样不仅能避免nil的问题,逻辑也更直接:
func setTabState(whichTab: Int) { // 先校验索引合法性和控制器数组是否存在 guard let viewControllers = self.viewControllers, whichTab >= 0, whichTab < viewControllers.count else { print("标签页索引无效或未配置子控制器") return } let targetViewController = viewControllers[whichTab] // 切换该标签页的启用状态 targetViewController.tabBarItem.isEnabled = !targetViewController.tabBarItem.isEnabled }
额外注意事项
- 如果你需要在控制器刚启动时调用这个方法,建议放在
viewDidAppear(_:)里,而不是更早的生命周期方法,确保所有视图和控制器都已经完成初始化。 - 如果是响应某个事件(比如网络请求完成、用户操作)调用,只要此时
UITabBarController已经完成初始化,这个函数就能正常工作。
内容的提问来源于stack exchange,提问作者squarehippo10
相关产品推荐
相关产品推荐

