2010-09-22 16 views
23

Tengo una aplicación de barra de pestañas y necesito saber cuándo y qué botón toca un usuario en la barra de pestañas para mostrar las notificaciones apropiadas y tal.UITabBar (Controlador) - ¿Obtener índice de tapped?

En resumen: ¿Qué debo hacer para detectar el índice de un UITabBarItem girado en una UITabBar?

¡Gracias de antemano!

+0

Por favor, tenga en cuenta esta cuestión como una respuesta :-) http: // stackoverflow.com/questions/31521951/how-to-get-the-tag-of-selected-uitabbaritem-in-uitabbarcontroller-for-more-than –

Respuesta

92

La respuesta depende de si el UITabBar está o no gestionado por un UITabBarController.

Caso 1 - UITabBar ya está manejado por un UITabBarController

aplicar el Protocolo UITabBarControllerDelegate. Específicamente el método tabBarContoller:didSelectViewController:. Establezca una instancia de su clase que implemente el protocolo como delegate del UITabBarController.

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

En este caso hay que tener en cuenta la situación especial en el que tiene suficientes controladores en el controlador ficha para causar la pestaña "Más" que se mostrará. En ese caso, recibirá una llamada al tabBarController:didSelectViewController: con un controlador de vista que no está en la lista (es una instancia de una clase UIKit interna UIMoreNavigationController). En ese caso, el indexOfTab en mi muestra será NSNotFound.

Caso 2 - UITabBar no está ya manejado por un UITabBarController

aplicar el Protocolo UITabBarDelegate. Específicamente el método tabBar:didSelectItem:. Establezca una instancia de su clase que implemente el protocolo como delegate del UITabBar.

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

EDIT: Modificado las variables de parámetros método para eliminar advertencia sobre tabBarController se oculta la compilación de la OP.

+0

¡Gracias, gracias, gracias! Xcode escupe algunos errores: "advertencia: la declaración local de 'tabBarController' oculta la variable de instancia'", ¿hay algo de lo que deba preocuparme? – esqew

+0

Lo siento, pero ¿cómo averiguas qué caso eres? – JaseC

6

Hay un método definido en el protocolo UITabBarDelegate llamado tabBar:didSelectItem:, que le notificará cuál y cuándo se selecciona (punteado) un UITabBarItem.

2

lo hice así: Se trata de una clase personalizada que se extiende 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:

prefiero

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