UITabBar (Controller) - Получить индекс нажатой?
У меня есть приложение на панели вкладок, и мне нужно знать, когда и какая кнопка пользователь нажимает на панель вкладок, чтобы отображать соответствующие уведомления и т.д.
Вкратце: Как я могу найти индекс обнаруженного UITabBarItem на UITabBar?
Спасибо заранее!
Ответы
Ответ 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()