iphone - uitabbarcontroller swift 4
¿Cambia a una vista de pestaña TabBar programáticamente? (9)
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 pestañas 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.
Como la solución de Stuart Clark, pero para Swift 3:
func setTab<T>(_ 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 {
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 pestañas, 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
.
Para los casos en los que puede mover las pestañas, 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;
}
}
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;
}
}
Prueba esto:
self.tabBarController.selectedIndex = 1;
o
[self.tabBarController setSelectedIndex:1];
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
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.
Tenga en cuenta que las pestañas 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.
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;
}
}