如何禁用UITabBarController的moreNavigationController中的部分标签?
解决方案
问题原因
你之前的代码错误访问了moreNavigationController.toolbarItems,这个属性是More页面底部工具栏的条目,不是你要修改的顶部列表中的标签条目,所以获取结果为nil。
你在Storyboard中设置的禁用属性不生效,是因为系统加载TabBar控制器时,会优先使用运行时属性覆盖Storyboard的部分配置,直接通过代码修改优先级更高。
可行实现步骤
UITabBarController的viewControllers属性包含了所有绑定的标签子控制器,不管是显示在底部标签栏还是More列表中,每个子控制器的tabBarItem属性就是对应标签的配置实例,直接修改其isEnabled属性即可同步作用于底部标签栏和More列表。
你的场景下共7个标签,前4个为底部显示标签,第5、第6个(对应数组索引4、5)就是More列表的前2个待禁用标签,按如下方式操作即可:
- 给当前使用的UITabBarController创建自定义子类(不需要修改原有业务逻辑,仅重写生命周期方法即可)
- 在子类的
viewDidLoad方法中添加禁用逻辑,代码示例:
class CustomTabBarController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() // 校验子控制器数量是否符合预期 guard let allVCs = viewControllers, allVCs.count >= 6 else { return } // 禁用More列表第一个标签 allVCs[4].tabBarItem.isEnabled = false // 禁用More列表第二个标签 allVCs[5].tabBarItem.isEnabled = false } }
- 回到Storyboard,选中你的UITabBarController,在身份检查器中将自定义类改为你创建的
CustomTabBarController。
修改后这两个标签在More列表中会自动显示为灰色,用户点击后不会触发任何跳转,完全符合需求。
内容的提问来源于stack exchange,提问作者Tio
相关产品推荐
相关产品推荐

