esqew
esqew

Reputation: 44713

UITabBar(Controller) - Get index of tapped?

I've got a tab bar application and I need to know when and what button a user taps on the tab bar as to display the appropriate notifications and such.

In short: How would I go about detecting the index of a tapped UITabBarItem on a UITabBar?

Thanks in advance!

Upvotes: 31

Views: 34945

Answers (6)

lenooh
lenooh

Reputation: 10682

SWIFT:

// 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))")
}

Upvotes: 14

Pavel Shorokhov
Pavel Shorokhov

Reputation: 4994

Simple extension for Swift 4:

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

And usage:

let index = getSelectedTabIndex()

Upvotes: 2

dengApro
dengApro

Reputation: 4018

SWIFT 4:

I prefer

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

Upvotes: 13

imaginaryboy
imaginaryboy

Reputation: 5999

The answer depends on whether or not the UITabBar is managed by a UITabBarController or not.

Case 1 - UITabBar is already handled by a UITabBarController

Implement the UITabBarControllerDelegate protocol. Specifically the tabBarContoller:didSelectViewController: method. Set an instance of your class that implements the protocol as the delegate of the UITabBarController.

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

In this case you have to be aware of the special situation where you have enough controllers in the tab controller to cause the "More" tab to be displayed. In that case you'll receive a call to the tabBarController:didSelectViewController: with a view controller that isn't in the list (it's an instance of an internal UIKit class UIMoreNavigationController). In that case the indexOfTab in my sample will be NSNotFound.

Case 2 - UITabBar is NOT already handled by a UITabBarController

Implement the UITabBarDelegate protocol. Specifically the tabBar:didSelectItem: method. Set an instance of your class that implements the protocol as the delegate of the UITabBar.

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

EDIT: Modified the method parameter variables to eliminate the OP's compilation warning about tabBarController being hidden.

Upvotes: 99

Shishi
Shishi

Reputation: 611

I did it like this : This is in a custom class which extends 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]);
}

Upvotes: 2

Jacob Relkin
Jacob Relkin

Reputation: 163288

There's a method defined in the UITabBarDelegate protocol called tabBar:didSelectItem:, which will notify you of which and when a UITabBarItem is selected (tapped).

Upvotes: 7

Related Questions