2010-09-22 10 views
23

Ho un'applicazione di tabulazione e ho bisogno di sapere quando e quale pulsante un utente tocca sulla barra delle schede per visualizzare le notifiche appropriate e così via.UITabBar (Controller) - Ottieni l'indice di TAPpato?

In breve: In che modo è possibile rilevare l'indice di un UITabBarItem TAPpato su un UITabBar?

Grazie in anticipo!

+0

Vi preghiamo di considerare questa domanda come una risposta :-) http: // StackOverflow.it/questions/31521951/how-to-get-the-tag-of-selected-uitabbaritem-in-uitabbarcontroller-per-di-più di –

risposta

92

La risposta dipende dal fatto che UITabBar sia gestito o meno da un UITabBarController.

Caso 1 - UITabBar è già gestito da un UITabBarController

implementare il protocollo UITabBarControllerDelegate. In particolare il metodo tabBarContoller:didSelectViewController:. Imposta un'istanza della classe che implementa il protocollo come delegate di UITabBarController.

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

In questo caso si deve essere a conoscenza della situazione particolare in cui si hanno abbastanza controller nel controller scheda per causare la scheda "Altro" per essere visualizzato. In tal caso riceverai una chiamata allo tabBarController:didSelectViewController: con un controller di visualizzazione che non è nell'elenco (è un'istanza di una classe UIKit interna UIMoreNavigationController). In tal caso il indexOfTab nel mio campione sarà NSNotFound.

Caso 2 - UITabBar non è già gestito da un UITabBarController

implementare il protocollo UITabBarDelegate. In particolare il metodo tabBar:didSelectItem:. Imposta un'istanza della classe che implementa il protocollo come delegate di UITabBar.

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

EDIT: Modificato le variabili dei parametri metodo per eliminare la compilazione del PO avvertimento circa tabBarController essere nascosto.

+0

Grazie, grazie, grazie !! Xcode sputa alcuni errori: "avviso: la dichiarazione locale di" tabBarController "nasconde la variabile di istanza" ", tutto ciò di cui ho bisogno di preoccuparmi? – esqew

+0

Scusa ma come fai a capire quale caso sei? – JaseC

6

C'è un metodo definito nel protocollo UITabBarDelegate chiamato tabBar:didSelectItem:, che ti informerà di quale e quando è selezionato un UITabBarItem (toccato).

2

ho fatto in questo modo: Questo è in una classe personalizzata che si estende 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]); 
} 
5

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

SWIFT 4:

preferisco

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