¿Cambia a una vista de pestaña TabBar programáticamente?

Digamos que tengo un UIButton en una vista de pestaña en mi aplicación de iPhone, y quiero que abra una pestaña diferente en la barra de tabs de TabBarController . ¿Cómo escribiría el código para hacer esto?

Supongo que descargo la vista existente y cargo una vista de pestaña específica, pero no estoy seguro de cómo escribir el código exactamente.

Prueba esto:

 self.tabBarController.selectedIndex = 1; 

o

 [self.tabBarController setSelectedIndex:1]; 

Tenga en cuenta que las tabs están indexadas a partir de 0. Entonces, el siguiente fragmento de código funciona

 tabBarController = [[UITabBarController alloc] init]; . . . tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:4]; 

va a la quinta pestaña en la barra.

Simplemente puede establecer la propiedad selectedIndex en el UITabBarController en el índice apropiado y la vista se cambiará de la misma forma que el usuario presionó el botón de tabulación.

Mi opinión es que selectedIndex o el uso de objectAtIndex no es necesariamente la mejor manera de cambiar la pestaña. Si reordena sus tabs, una selección de índice codificada puede afectar el comportamiento de su aplicación anterior.

Si tiene la referencia de objeto del controlador de vista al que desea cambiar, puede hacer:

 tabBarController.selectedViewController = myViewController 

Por supuesto, debe asegurarse de que myViewController realmente se encuentre en la lista de tabBarController.viewControllers .

Probé lo que sugería Disco S2, estaba cerca, pero esto fue lo que terminó funcionando para mí. Esto fue llamado después de completar una acción dentro de otra pestaña.

 for (UINavigationController *controller in self.tabBarController.viewControllers) { if ([controller isKindOfClass:[MyViewController class]]) { [self.tabBarController setSelectedViewController:controller]; break; } } 

Para los casos en los que puede mover las tabs, aquí hay un código.

 for ( UINavigationController *controller in self.tabBarController.viewControllers ) { if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) { [self.tabBarController setSelectedViewController:controller]; break; } } 

Quería poder especificar qué pestaña se mostraba por clase en lugar de índice, ya que pensé que era una solución robusta que dependía menos de cómo se conectara IB. No encontré las soluciones de Disco o Joped para que funcionen, así que creé este método:

 -(void)setTab:(Class)class{ int i = 0; for (UINavigationController *controller in self.tabBarContontroller.viewControllers){ if ([controller isKindOfClass:class]){ break; } i++; } self.tabBarContontroller.selectedIndex = i; } 

lo llamas así:

 [self setTab:[YourClass class]]; 

Espero que esto sea útil para alguien

Usar en el archivo AppDelegate.m :

 (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 me %u",self.tabBarController.selectedIndex); break; case 1: NSLog(@"click me again!! %u",self.tabBarController.selectedIndex); break; default: break; } } 

Como la solución de Stuart Clark, pero para Swift 3:

 func setTab(_ myClass: T.Type) { var i: Int = 0 if let controllers = self.tabBarController?.viewControllers { for controller in controllers { if let nav = controller as? UINavigationController, nav.topViewController is T { break } i = i+1 } } self.tabBarController?.selectedIndex = i } 

Úselo así:

 setTab(MyViewController.self) 

Tenga en cuenta que mi tabController se vincula a viewControllers detrás de navigationControllers. Sin navigationControllers se vería así:

 if let controller is T { 

Como la solución de Stuart Clark, pero para Swift 3 y el uso de identificador de restauración para encontrar la pestaña correcta:

 private func setTabById(id: String) { var i: Int = 0 if let controllers = self.tabBarController?.viewControllers { for controller in controllers { if let nav = controller as? UINavigationController, nav.topViewController?.restrationIdentifier == id { break } i = i+1 } } self.tabBarController?.selectedIndex = i } 

Úselo de esta manera (“Humanos” y “Robots” también se deben configurar en el guión gráfico para viewController específico y su ID de restauración, o use ID de Storyboard y marque “usar ID de guión gráfico” como ID de restauración):

 struct Tabs { static let Humans = "Humans" static let Robots = "Robots" } setTabById(id: Tabs.Robots) 

Tenga en cuenta que mi tabController se vincula a viewControllers detrás de navigationControllers. Sin navigationControllers se vería así:

 if controller.restrationIdentifier == id {