iOS: Как открыть 0-й индекс tabBarItem, щелкнув 3-й индекс tabBarItem - PullRequest
2 голосов
/ 01 августа 2020

У меня 5 tabBarItem в моем UITabBarController Один сценарий, мне нужно открыть первый индекс 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
         } 

    }
}

Ошибка: *** Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Непосредственное изменение панели вкладок, управляемой контроллером панели вкладок, не допускается.»

Пожалуйста, посоветуйте мне, как этого добиться.

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Вы не хотите, чтобы базовый класс вашего контроллера представления был UITabBarDelegate. Если бы вы сделали это, все ваши подклассы контроллера представления были бы делегатами панели вкладок. Я думаю, вы хотите расширить UITabBarController

class FiveTabbarController: UITabBarController, UITabBarControllerDelegate {

, затем в этом классе переопределить viewDidLoad и там установить для свойства делегата значение self:

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

теперь этот класс является как UITabBarDelegate (поскольку UITabBarController реализует этот протокол), так и UITabBarControllerDelegate, и вы можете переопределить / реализовать эти методы делегата по желанию, например:

    extension FiveTabbarController: UITabBarControllerDelegate {

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
       if let getSelectedIndex = tabBarController.viewControllers?.firstIndex(of: viewController), getSelectedIndex == 2 {
            self.selectedIndex = 0
        }
    }
}
1 голос
/ 02 августа 2020

Вы можете добиться такого поведения, выполнив:

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

Причина ошибки в том, что вы не должны изменять selectedItem, а только индекс. Изменяя индекс, контроллер панели вкладок установит selectedItem.

Отредактировано Не заметил, что вы используете метод tabBar вместо tabbarcontroller.

...