objective c - descargar - Aplicación para iPhone: detecta qué elemento de la barra de pestañas se presionó
ios 12 (7)
Tengo una aplicación basada en la barra de pestañas, con más de 5 elementos de la barra de pestañas, por lo que obtengo 4 de ellas que se muestran directamente en la vista y el resto está disponible seleccionando la pestaña "Más". Cuando se presiona un elemento de la barra de pestañas, quiero detectar cuál era.
Así, en el
- (void)tabBarController:(UITabBarController *)tabBarCtrl didSelectViewController:(UIViewController *)viewController
método - (void)tabBarController:(UITabBarController *)tabBarCtrl didSelectViewController:(UIViewController *)viewController
, uso tabBarCtrl.selectedViewController.title
para obtener el título del elemento.
Esto funciona para las pestañas visibles en la vista, que son las 4 primeras y la pestaña "Más", pero no funciona para el resto de los elementos de la barra de pestañas que se muestran en la lista después de presionar la pestaña "Más".
Puedo ver que el método didSelectViewController ni siquiera se llama cuando se selecciona una pestaña de la lista "Más".
¿Cómo puedo detectar alguno de ellos al presionarlos?
Gracias de antemano.
Puede acceder al índice del elemento seleccionado utilizando el siguiente código en su UIViewController
. Siempre devolverá el índice de tu pestaña.
self.tabBarController.selectedIndex;
Entonces, si tiene, por ejemplo, 6 elementos, puede ir a la pestaña "Más ...", seleccione su "5to" y el índice seleccionado será 4 . Si vas a la pestaña Más y seleccionas el sexto elemento, devolverá 5 .
EDITAR: Si desea verificar la posición actual de algunos UITabBarItem, puede hacer esto:
Primero, en su archivo XIB debe editar la propiedad de tag
de cada pestaña, de modo que la primera pestaña tenga la etiqueta = 100, 2nd - 200, 3rd - 300, etc.
Luego en ViewController agrega este código:
UIViewController *selectedVC = [self.tabBarController.viewControllers objectAtIndex:self.tabBarController.selectedIndex];
int selectedItemTag = selectedVC.tabItem.tag;
Luego, puede determinar qué viewController es usando la variable selectedItemTag
. En este caso, puede determinar selectedIndex por doint esto: selectedIndex = (selectedItemTag-100)/100
.
Las propiedades de las tag
no se modifican al personalizar su UITabBar, por lo que puede confiar en ellas :)
Puede detectar cuándo se presionó una pestaña usando los métodos de UITabBarDelegate: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITabBarDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITabBarDelegate
Puede hacer que su clase UITabBarController sea el delegado y agregar el método en la implementación:
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
NSLog(@"tab selected: %@", item.title);
}
Si está utilizando un controlador de la barra de pestañas, debe evitar conocer la asignación entre los elementos de la pestaña y los controladores de visualización: ese es el trabajo del controlador de la barra de pestañas. Si está tratando de usar una barra de pestañas para otra cosa, entonces debe usar UITabBar directamente y no utilizar UITabBarController. Si usa UITabBar, puede establecer su propio objeto como delegado de la barra de pestañas, y el delegado recibirá mensajes cada vez que cambie el elemento seleccionado.
Ya que agrega etiquetas a CADA UITabBarItem
(incluso aquellas con índice 5 y más).
Puede rastrear qué pestaña fue seleccionada usando el siguiente código:
//MARK: - UITabBarControllerDelegate
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
if viewController == tabBarController.moreNavigationController {
tabBarController.moreNavigationController.delegate = self
} else {
setSelectedTabBarOption()
}
}
//MARK: - UINavigationControllerDelegate
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
setSelectedTabBarOption()
}
private func setSelectedTabBarOption() {
if let viewControllers = viewControllers {
let selectedController: UIViewController? = viewControllers.count > selectedIndex ? viewControllers[selectedIndex] : nil
if let tag = selectedController?.tabBarItem.tag {
//do whatever with your tag
}
}
}
¿Cómo obtener el título de UITabBarItem en la sección Más?
- (void)tabBarController:(UITabBarController *)tabBarController
didSelectViewController:(UIViewController *)viewController
{
NSLog(@"controller class: %@", NSStringFromClass([viewController class]));
NSLog(@"controller title: %@", viewController.title);
if (viewController == tabBarController.moreNavigationController)
{
tabBarController.moreNavigationController.delegate = self;
}
}
1. Entonces, si está utilizando un UITabBarController, puede hacer que la clase implemente el UITabBarControllerDelegate y configurar su delegado UITabBarController en la clase que necesita ser notificada cuando el elemento seleccionado TabBar cambie, luego agregue el método del delegado a su clase:
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
Dentro de este método, puede utilizar la propiedad selectabdex UITabBarController para saber cuál es el índice actual seleccionado:
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController: (UIViewController *)viewController
{
NSLog(@"Selected index: %d", tabBarController.selectedIndex);
}
2. Si no está utilizando solo la Barra de la barra de herramientas , puede seguir la respuesta aquí por Ken Pespisa e iCoder en esta publicación. Ken Pespisa e iCoder en esta publicación.
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
NSLog(@"Selected index: %d", tabBarController.selectedIndex);
if (viewController == tabBarController.moreNavigationController)
{
tabBarController.moreNavigationController.delegate = self;
}
NSUInteger selectedIndex = tabBarController.selectedIndex;
switch (selectedIndex) {
case 0:
NSLog(@"click tabitem %u",self.tabBarController.selectedIndex);
break;
case 1:
NSLog(@"click me again!! %u",self.tabBarController.selectedIndex);
break;
default:
break;
}
}