Подтвердить что ты не робот

UITabBar (Controller) - Получить индекс нажатой?

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

Вкратце: Как я могу найти индекс обнаруженного UITabBarItem на UITabBar?

Спасибо заранее!

4b9b3361

Ответ 1

Ответ зависит от того, управляется ли UITabBar UITabBarController или нет.

Случай 1 - UITabBar уже обрабатывается UITabBarController

Внедрить протокол UITabBarControllerDelegate. В частности, метод tabBarContoller:didSelectViewController:. Установите экземпляр вашего класса, который реализует протокол как delegate UITabBarController.

- (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController {
    NSUInteger indexOfTab = [theTabBarController.viewControllers indexOfObject:viewController];
    NSLog(@"Tab index = %u (%u)", (int)indexOfTab);
}

В этом случае вы должны знать о особой ситуации, когда у вас достаточно контроллеров в контроллере табуляции, чтобы отобразить вкладку "Дополнительно". В этом случае вы получите вызов tabBarController:didSelectViewController: с контроллером представления, которого нет в списке (это экземпляр внутреннего класса UIKit UIMoreNavigationController). В этом случае indexOfTab в моем примере будет NSNotFound.

Случай 2 - UITabBar уже не обрабатывается UITabBarController

Внедрить протокол UITabBarDelegate. В частности, метод tabBar:didSelectItem:. Задайте экземпляр вашего класса, который реализует протокол как delegate UITabBar.

- (void)tabBar:(UITabBar *)theTabBar didSelectItem:(UITabBarItem *)item {
    NSUInteger indexOfTab = [[theTabBar items] indexOfObject:item];
    NSLog(@"Tab index = %u", (int)indexOfTab);
}

EDIT: Изменены параметры параметра метода, чтобы исключить предупреждение о компиляции OP о tabBarController.

Ответ 2

SWIFT 3:

// somewhere inside your TabBarViewController
//...
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    let indexOfTab = tabBar.items?.index(of: item)
    print("pressed tabBar: \(String(describing: indexOfTab))")
}

Ответ 3

Существует метод, определенный в протоколе UITabBarDelegate под названием tabBar:didSelectItem:, который будет уведомлять вас о том, какой из них и когда выбрано (tapped) UITabBarItem.

Ответ 4

SWIFT 4:

Я предпочитаю

// somewhere inside your TabBarViewController
//...
func tabBarController(_ tabBarController: UITabBarController, 
                  shouldSelect viewController: UIViewController) -> Bool{
    let index = tabBarController.viewControllers?.index(of: viewController)
    return true// you decide
}

Ответ 5

Я сделал это так: Это в пользовательском классе, который расширяет UITabBarController

.h

@interface CustomTabBarController : UITabBarController<UITabBarDelegate>

.m

-(void)tabBar:(UITabBar *)theTabBar didSelectItem:(UIViewController *)viewController
{
    NSLog(@"Tab index = %@ ", theTabBar.selectedItem);
    for(int i = 0; i < theTabBar.items.count; i++)
    {
        if(theTabBar.selectedItem == theTabBar.items[i])
        {
            NSLog(@"%d",i);// this will give the selected tab
        }

    }
    //NSlog(@"Items = %@", theTabBar.items[0]);
}

Ответ 6

Простое расширение для Swift 4:

extension UITabBarController {
    func getSelectedTabIndex() -> Int? {
        if let selectedItem = self.tabBar.selectedItem {
            return self.tabBar.items?.firstIndex(of: selectedItem)
        }
        return nil
    }
}

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

let index = getSelectedTabIndex()