Определить выбранный индекс/элемент UITabBar, который задан программно

Я хотел бы знать, как мы обнаруживаем, когда выбранный элемент или индекс TabBar изменен , когда изменения выполняются программно?

self.tabBarController.selectedIndex = 1;

Эта функция делегата обнаруживает изменения только при выборе пользователем элемента tabBar. Он не срабатывает, когда изменения в selectedIndex выполнялись программно.

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    println("tabBarController didSelectViewController")
}

override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
    println("tabBar didSelectItem")
}

Ответ 1

Предыдущих ответов достаточно, чтобы "обнаружить" изменения, однако он не обнаруживает, какой индекс нажат.

func selectItemWithIndex(value: Int) {
    self.tabBarControllertabBarController.selectedIndex = value;
    self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]);
}

self.selectedIndex не вернет выбранный индекс сразу. Чтобы проверить, какой элемент нажат, нам нужно сравнить элемент с tabBarItems в нашем UITabBarController

override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
    if item == (self.tabBar.items as! [UITabBarItem])[0]{ 
       //Do something if index is 0
    }
    else if item == (self.tabBar.items as! [UITabBarItem])[1]{
       //Do something if index is 1
    }
}

Ответ 2

В дополнение ко всем ответам здесь, если вы уже подклассифицировали UITabBarController, вот простое решение для всех изменений в панели вкладок (пользовательский и программный):

// Override selectedViewController for User initiated changes
override var selectedViewController: UIViewController? {
    didSet {
        tabChangedTo(selectedIndex: selectedIndex)
    }
}
// Override selectedIndex for Programmatic changes    
override var selectedIndex: Int {
    didSet {
        tabChangedTo(selectedIndex: selectedIndex)
    }
}

// handle new selection
 func tabChangedTo(selectedIndex: Int) {}

Ответ 3

это не может быть сделано, но какой-то взлом может быть сделано, и я уверен, что это временное решение этой проблемы. переопределить метод ниже для tabbarcontrollerdelegate делать ваши вещи внутри это вызывается, когда вкладка переключается любым способом программно или нажав на элемент панели вкладок.

func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
{
    toVC.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.fontFuturaMedium11, NSForegroundColorAttributeName: UIColor.colorAppThemeColor], for: .normal)
    fromVC.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.fontFuturaBTBook11, NSForegroundColorAttributeName: UIColor.colorStudentTabText], for: .normal)
    return nil
}

Ответ 4

Swift 3

Здесь несколько более безопасная версия Swift-3, предложенная выше:

func selectItem(withIndex index: Int) {

    if  let controller = tabBarController,
        let tabBar = tabBarController?.tabBar,
        let items = tabBarController?.tabBar.items
    {
        guard index < items.count else { return }

        controller.selectedIndex = index
        controller.tabBar(tabBar, didSelect: items[index])
    }
}

UITabBarController:

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    if let items = tabBar.items {
        items.enumerated().forEach { if $1 == item { print("your index is: \($0)") } }
    }
}

Использование:

selectItem(withIndex: 1)

Ответ 5

В быстром, вы можете сделать это, переопределив selectedIndex свойство UITabBarController.

Первый подкласс UITabBarController и добавьте весь следующий код.

//Overriding this to get callback whenever its value is changes
   override var selectedIndex: Int {
      didSet {
         handleTabSelection(selectedIndex: selectedIndex)
      }
   }

Также добавьте этот метод делегата UITabBarControllerDelegate

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    //Tab tapped
    guard let viewControllers = tabBarController.viewControllers else { return }
    let tappedIndex = viewControllers.index(of: viewController)! 
    //Tab tapped at tappedIndex
    handleTabSelection(selectedIndex: tappedIndex)
}

Наконец, мы вызываем этот метод из обоих мест, чтобы обрабатывать все случаи.

private func handleTabSelection(selectedIndex: Int) {
    //Do something on tab selection at selectedIndex
}

Ответ 6

Я нашел прекрасное решение для этого. Спасибо Ckouta за эту идею.

Я просто создаю функцию для изменения индекса и запускаю делегатский протокол UITabBar didSelectItem

func selectItemWithIndex(value: Int) {
    self.tabBarControllertabBarController.selectedIndex = value;
    self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]);
}

Использование

    selectItemWithIndex(1);

Ответ 7

Я только заботился о selectIndex в одном из VC в стеке панели панели вкладок. Итак, я KVO: ed segmentedIndex на экземпляре tabbarcontroller из этого VC. Хорошо работает, никаких реальных проблем.

Ответ 8

Swift 4: - Вы должны использовать эти строки кода для обнаружения индекса выбранного элемента UITabBar.

func tabBar (_ tabBar: UITabBar, didSelect item: UITabBarItem) {

    if item == (tabBar.items)![0] {

    }
    else if item == (tabBar.items)![1] {

    }
}