2011-01-20 14 views
28

Tengo un proyecto básico creado en xcode como una "Aplicación de barra de pestañas", lo que me gustaría es tener la aplicación en el interruptor de carga en la 2ª pestaña si BOOL x es verdadero.Cambiando programáticamente la pestaña seleccionada de tabBarController

En este momento me he: (ubicado en FirstViewController.m en viewDidLoad)

if(x){ 
    [self.tabBarController setSelectedIndex:1]; 
} 

Esto hace que la ficha seleccionada en la parte inferior de la página para seleccionar la pestaña del segundo, sin embargo la vista sigue siendo el de la primera lengüeta.

¿Qué debo hacer para cambiar la vista a la de la segunda pestaña?

+1

Lo que tienes es correcta en el nivel de la superficie. Sospecho que hay algo extraño en la forma en que se configura el controlador de la barra de pestañas. Si tuviera que registrar la propiedad viewControllers de su controlador de la barra de pestañas, ¿ve distintos controladores de vista? –

+0

Sí, si registro viewControllers, recupero una matriz de los 3 controladores en mi proyecto. –

+1

Bien, entonces si registra la propiedad ViewController seleccionada de su controlador de la barra de pestañas antes y después de la llamada a -setSelectedIndex :, ¿son los controladores lo que espera que sean, o permanece igual? –

Respuesta

46

Bueno, reproduje su problema y lo resolvió moviendo la lógica de conmutación de -viewDidLoad a -viewDidAppear :. Así que, básicamente, el cambio:

- (void)viewDidLoad { 
    // Other code... 
    if(x){ 
     [self.tabBarController setSelectedIndex:1]; 
    } 
} 

a:

- (void)viewDidAppear:(BOOL)animated { 
    // Other code... 
    if(x){ 
     [self.tabBarController setSelectedIndex:1]; 
    } 
} 

Ahora, en cuanto a por qué este es el caso, sólo puedo adivinar, sin más excavación, que tiene que ver con las cosas de pedidos están inicializado Es posible que se llame al viewDidLoad de su controlador de vista antes de que el controlador de la barra de pestañas principal haya terminado su propia inicialización. Esperar hasta que aparezca su vista asegura que todo esté cargado y en un estado consistente.

+0

Ah funciona mejor que mi solución. Gracias –

+0

esto no funciona para mí. No sé por qué ... Puse el mismo código [self.tabBarController setSelectedIndex: 1]; dentro de una función que se ejecuta cuando se presiona un botón. ¿Tienes ideas? – acecapades

+0

@acecapades, ¿está diciendo que el código _no funciona_ cuando se coloca en un manejador de botones? –

3
[self.tabBarController setSelectedIndex:1] 
[window addSubview:[tabBarController view]]; 
[window makeKeyAndVisible]; 
+0

Aparece la ventana No declarada, si la cambio a self.window se equivoca con "Solicitud de miembro 'ventana' en algo que no es una estructura o unión" –

+1

Este código está destinado a ejecutarse desde la aplicación del delegado -applicationDidFinishLaunching: . No funcionará como está desde la implementación de su controlador de vista. –

+0

Ese es mi problema, esto necesita ejecutarse desde un controlador de vista. He simplificado el problema anterior, pero no sabré el tiempo o no, necesito enviarlo a la pestaña hasta que se realice cierta carga en esa vista en particular. –

4

Esto sería suficiente:

[tabBar setSelectedIndex:0];

9

Suponiendo que se está trabajando con un controlador que es una subclase de la UITabBarController, sólo es necesario para establecer la propiedad selectedIndex.

Por ejemplo:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    self.selectedIndex = 1; 
} 

Prefiero hacer esta asignación en el método viewDidLoad por lo que se puede garantizar que sólo se muestra el controlador de vista en el índice seleccionado. Si usa la función viewDidAppear, ocasionalmente verá el controlador de visualización en el índice 0 que se muestra brevemente cuando se carga la barra de pestañas antes de que se muestre el que está en el índice 1.

+0

Intenté muchas cosas. Este fue el único que trabaja, Gracias –

0

para SWIFT 3,0

if(x){ self.tabBarController?.selectedIndex = 1 }

Cuestiones relacionadas