12

Lo siento por la pregunta de novato. Tengo una UITabBar en mi vista de ventana principal, así como una matriz de UINavigationControllers para cada pestaña. La estructura es similar a la aplicación iPod en que las vistas principales se pueden ver seleccionando elementos TabBar y luego el usuario puede profundizar más con NavigationController al empujar las vistas a la pila.Presionando programáticamente un botón UITabBar en Xcode

Lo que me gustaría hacer es hacer el equivalente a presionar un botón TabBar en la parte inferior de cualquiera de las subvistas en el código (es decir, cambiar la propiedad seleccionada del TabBar y mostrar el primer controlador de vista para la pestaña).

Cualquier ayuda sería muy apreciada.

de Dave

Respuesta

23
[myTabBarController setSelectedIndex:index] 

EDIT: Respondiendo a la pregunta parte 2 del comentario:

Se puede definir un método en el AppDelegate para cambiar a una pestaña diferente.

Y puede hacerse con AppDelegate desde cualquier lugar y enviar un mensaje .. algo como:

MyAppDelegate *appDelegate = (MyAppDelegate*) [[UIApplication sharedApplication] delegate]; 
[appDelegate SwitchToTab:index] 
+0

¡Para mí, configurar el método de llamada a tabbarcontroller parece correcto! ¡Pero comprobará que no importa! – prakash

+0

Sí, puede tener razón, tomé una parte de mi código donde utilicé TabBar sin tabbarcontroller – Vladimir

+0

Esto es genial gracias. OK, pregunta muda parte 2. ¿Cómo llego al objeto raíz de mi código? El TabBar real está configurado en código desde el controlador de vista raíz. Quiero poder establecer la propiedad del TabBar pero desde otro controlador de vista que se envió a la pila. ¿Estoy explicando eso lo suficientemente bien? Es como si necesitara un equivalente de mí mismo, pero para el objeto padre en la parte superior del árbol. Nuevamente, disculpe la nueva pregunta, me estoy perdiendo algo bastante fundamental en mi forma de pensar, supongo. –

11

alternativamente ...

[self.parentViewController.tabBarController setSelectedIndex:3]; 
3

me gustaría responder a Prakash, pero no puedo entender cómo. Tal vez estoy bloqueado hasta que mi puntaje suba.

De todos modos, espero que esto ayude a alguien:

que estaba haciendo lo que dijo Prakash, y no pasaba nada. Es porque para obtener un puntero a mi aplicación delegado, yo estaba haciendo esto:

AppDelegate_Phone *appDelegate = [[AppDelegate_Phone alloc] init]; 

cuando debería haber estado haciendo esto:

AppDelegate_Phone *appDelegate = (AppDelegate_Phone *) [[UIApplication sharedApplication] delegate]; 

Novato error.

0

Para ello, sólo tiene que tomar controlador UITabBar -

.h Archivo -

UITabBarController *_pTabBarController; 
@property (nonatomic, retain) IBOutlet UITabBarController *_pTabBarController; 

.m File - 
// synthesize it 
@synthesize _pTabBarController;  

At initial load 

// You can write one function to add tabBar - 

// As you have already mentioned you have created an array , if not 

_pTabBarController = [[UITabBarController alloc] init]; 
    NSMutableArray *localViewControllersArray = [[NSMutableArray alloc] initWithCapacity:4]; 
    UINavigationController *theNavigationController; 

    _pController = [[Controller alloc] initStart]; 
    _pController.tabBarItem.tag = 1; 
    _pController.title = @"Baranches"; 
    theNavigationController = [[UINavigationController alloc] initWithRootViewController:_pController]; 
    theNavigationController.tabBarItem.tag = 1; 
    theNavigationController.tabBarItem.image = [UIImage imageNamed:@"icon_branches.png"]; 
    [localViewControllersArray addObject:theNavigationController]; 
    [theNavigationController release]; 

que se puede establecer el índice según sus necesidades

self._pTabBarController.selectedIndex = 0; // as per your requirements 
0
[self.parentViewController.tabBarController setSelectedIndex:3]; 

seleccionados el índice para mí, pero simplemente destacó el índice del navegador de navegación como el índice activo, pero mientras resaltaba que ndex estaba realmente en un controlador de vista diferente al sugerido por el elemento tabbarmenu.

Solo quería agregar que utilicé esto desde mi controlador de vista, y funcionó como si realmente alguien hubiera presionado el elemento de menú; desde el código:

UITabBarController *MyTabController = (UITabBarController *)((AppDelegate*) [[UIApplication sharedApplication] delegate]).window.rootViewController; 
[MyTabController setSelectedIndex:1]; 

Gracias por esta publicación/respuestas me ayudó mucho en mi proyecto.

0

Quería hacer algo similar, pero para XCode 6.4 iOS (8.4) setSelectedIndex por sí mismo no lo hará.

Añadir los controladores de vista de la barra de pestañas a una lista y luego usar algo como lo siguiente respecto de una función y luego llamarlo:

FirstViewController *firstVC = [[self viewControllers] objectAtIndex:0]; 
[self.selectedViewController.view removeFromSuperview] 
[self.view insertSubview:firstVC.view belowSubview:self.tabBar]; 
[self.tabBar setSelectedItem:self.firstTabBarItem]; 
self.selectedViewController = firstVC; 

Es posible que tenga un código similar ya dentro de su didSelectedItem ..

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { 

    if (item == self.firstTabBarItem) 
     // Right here 
    } 
    else if ... 
} 
Cuestiones relacionadas