UITabBar (contrôleur) - obtenir l'index de taraudé?

J'ai une application de barre d'onglets et j'ai besoin de savoir quand et quel bouton un utilisateur tape sur la barre d'onglets pour afficher les notifications appropriées et autres.

En bref: Comment pourrais-je détecter l'index D'un uitabbaritem tapé sur un UITabBar?

Merci d'avance!

23
demandé sur Jacob Relkin 2010-09-22 08:08:29

5 réponses

La réponse dépend si UITabBar est géré par un UITabBarController ou non.

Cas 1-UITabBar est déjà géré par un UITabBarController

Mettre en œuvre le protocole UITabBarControllerDelegate. Plus précisément la méthode tabBarContoller:didSelectViewController:. Définissez une instance de votre classe qui implémente le protocole en tant que delegate du UITabBarController.

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

Dans ce cas, vous devez être conscient de la situation particulière où vous avez suffisamment de contrôleurs dans le contrôleur d'onglet pour provoquer le Onglet "Plus" à afficher. Dans ce cas, vous recevrez un appel à tabBarController:didSelectViewController: avec un contrôleur de vue qui n'est pas dans la liste (c'est une instance d'une classe UIKit interne UIMoreNavigationController). Dans ce cas, le indexOfTab dans mon échantillon sera NSNotFound.

Cas 2-UITabBar N'est pas déjà géré par un UITabBarController

Mettre en œuvre le protocole UITabBarDelegate. Plus précisément la méthode tabBar:didSelectItem:. Définissez une instance de votre classe qui implémente le protocole en tant que delegate de la UITabBar.

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

EDIT: modifié les variables de paramètre de méthode pour éliminer l'avertissement de compilation de L'OP sur tabBarController étant caché.

95
répondu imaginaryboy 2015-10-29 18:27:36

Il existe une méthode définie dans le protocole UITabBarDelegate appelée tabBar:didSelectItem:, qui vous informera de laquelle et quand un UITabBarItem est sélectionné (exploité).

6
répondu Jacob Relkin 2010-09-22 04:24:53

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))")
}
6
répondu lenooh 2017-05-17 13:10:29

Je l'ai fait comme ça : C'est dans une classe personnalisée qui étend 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]);
}
2
répondu Shishi 2014-05-04 09:03:17

SWIFT 4:

Je préfère

// somewhere inside your TabBarViewController
//...
func tabBarController(_ tabBarController: UITabBarController, 
                  shouldSelect viewController: UIViewController) -> Bool{
    let index = tabBarController.viewControllers?.index(of: viewController)
    return true// you decide
}
2
répondu dengApro 2017-12-20 04:08:10