iOS: 如何通过单击 tabBarItem 的第 3 个索引打开 tabBarItem 的第 0 个索引

iOS: How to open 0th Index of tabBarItem by clicking 3rd index of tabBarItem

我的 UITabBarController 中有 5 个 tabBarItem 一种情况,我必须通过单击第三个 UITabBarItem

打开 UITabBarItem 的第一个索引

我的做法如下:

extension FiveTabbarController: UITabBarControllerDelegate {
    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {

         if item == (self.tabBar.items!)[2] {
             tabBar.selectedItem = (self.tabBar.items!)[0] // ERROR
             self.selectedIndex = 0 // NOT WORKING
         } 

    }
}

Error: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Directly modifying a tab bar managed by a tab bar controller is not allowed.'

请指导我如何实现这一目标。

您可以通过以下方式实现该行为:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { 
    if selectedIndex == 2 {
        self.selectedIndex = 0
    }
}

错误的原因是你不应该修改selectedItem,只能修改索引。通过修改索引,选项卡栏控制器将设置 selectedItem。

已编辑 没有注意到你使用的是 tabBar 的方法而不是 tabbarcontroller 的方法。

您不希望视图控制器的基础 class 成为 UITabBarDelegate。如果你这样做,你所有的视图控制器子 classes 都将是标签栏委托。我认为您想做的是扩展 UITabBarController

class FiveTabbarController: UITabBarController, UITabBarControllerDelegate {

然后,在 class 中覆盖 viewDidLoad 并在那里将委托 属性 设置为 self:

 override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

现在这个 class 既是 UITabBarDelegate(因为 UITabBarController 实现了该协议),也是 UITabBarControllerDelegate,您可以根据需要 override/implement 这些委托的方法,例如:

    extension FiveTabbarController: UITabBarControllerDelegate {

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
       if let getSelectedIndex = tabBarController.viewControllers?.firstIndex(of: viewController), getSelectedIndex == 2 {
            self.selectedIndex = 0
        }
    }
}