22

Tengo un UITabBarController configurado en el guión gráfico. Quiero pasar un diccionario de datos del controlador de la barra de pestañas para usar en la pestaña secundaria correspondiente, que es un UIViewController estándar.¿Cómo paso los datos de un controlador de la barra de pestañas a una de sus pestañas?

Parece una larga pregunta para responder, pero realmente no sé por dónde empezar. Estoy buscando la forma más fácil de hacerlo. ¿Debo hacer que las pestañas funcionen programáticamente? Señalarme hacia cualquier documentación de desarrollador útil también sería muy apreciada.

-Austin
p.s. soy nuevo y hasta ahora he dependido del guión gráfico para las transiciones de viewcontroller

+0

Tengo problemas para analizar esto. ¿Cómo está almacenando datos en un UITabBarController? ¿Estás subclasificando UITabBarController? El controlador de la barra de pestañas es realmente solo un metacontrolador que se usa para controlar los controladores de vista. En el marco MVC de Apple, los controladores de vista deben usarse para vincular los datos del modelo a las vistas. Si necesita compartir datos entre los controladores de vista de una manera compleja, puede usar notificaciones, crear un singleton, almacenar los datos en un delegado de aplicaciones o usar un almacén externo compartido como CoreData. –

+0

Jeff, así que sea específico, paso los datos al UITabBarController, pero no entiendo cómo distribuir los datos a los controladores de vista con pestañas separados – austin

Respuesta

19

Me tomó un par de días, pero descubrí una solución simple. En el método viewDidLoad de mi tabBarController, puedo tener acceso y establecer los atributos de mis subvistas las pestañas usando

[[self viewControllers] objectAtIndex:0] 

o cualquier índice que desea acceder.

Guardando eso como una instancia de mi tab1_viewController me da un puntero al objeto, desde el cual puedo obtener y establecer mis valores de propiedad. Inicialmente, esto no estaba claro porque el guión gráfico creó los objetos tab_viewController para mí. ¡Nunca tuve la oportunidad de inicializarlos como quería!

+2

[self.viewVontrollers firstObject] es más seguro. – Adobels

+0

No podría haber soñado con una solución más fácil. ¡¡Oro!! Esto cubre la solución y analiza posibles problemas con más de 5 pestañas. http://makeapppie.com/2015/02/04/swift-swift-tutorials-passing-data-in-tab-bar-controllers/ – DogCoffee

3

Su mejor opción es usar notificaciones.

En su barra de pestañas, que podría hacer esto:

NSDictionary *myDictionary; // Populate this with your data. 

// Fire the notification along with your NSDictionary object. 
[[NSNotificationCenter defaultCenter] postNotificationName:@"Some_Notification_Name" 
                object:myDictionary];   

Luego, en la pestaña niño ViewController, que sería "escuchar" para esa notificación.

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleNotification:) 
              name:@"Some_Notification_Name" 
              object:nil]; 

- (void)handleNotification:(id)object { 
    // Use your NSDictionary object here. 
} 
+0

Tengo problemas para hacer que esto funcione. He intentado poner el código tabBarController en su viewDidLoad y en su tabBarController: didSelectViewController, sin éxito en ninguno de los dos. Puse el código hijo en su viewDidLoad – austin

0

Llegamos a este trabajo ...

tengo 3 controlador de vista, tengo que pasar la matriz de uno a otro ..

Aquí es lo que hice

Al añadir los datos a uno de vista de pestaña controlador

NSArray *viewControllers = [self.tabBarController viewControllers]; 
    ListViewController *listView = (ListViewController *)viewControllers[1]; 
    listView.myArray = self.myArray; 
    [self.tabBarController setSelectedIndex:1]; 

Y después de eso, cargar el controlador de vista, eso es todo

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
ListViewController *listView = (ListViewController *)[storyboard instantiateViewControllerWithIdentifier:@"IDListView"]; 
3

Si tienes un UINavigationController como uno de sus UITabBarController controladores de vista, puede hacer lo siguiente:

NSArray *viewControllers = [self.tabBarController viewControllers]; 
UINavigationController *myNavController = (UINavigationController *)viewControllers[2]; 
MyViewController *myController = [[myNavController childViewControllers] firstObject]; 
// Remember to alloc/init objects first if the objects haven't been initialized already. 
[myController.whateverArray = [[NSArray alloc] initWithArray:@[@"Example1", @"Example2"]]; 
[self.tabBarController setSelectedIndex:2]; 
2

Usando Swift

Si tiene UINavigationController como una de las pestañas en UITabBarController , desea obtener la instancia del controlador de vista secundaria en lugar de crear una nueva instancia y enviarla al controlador de vista de navegación antes de cambiar el índice de vista de pestaña. Puede hacer esto ...

Este código de ejemplo supone que el Controlador de navegación está en la primera pestaña (índice 0) y que "childViewController" está incrustado en el Controlador de navegación.

let viewControllers = self.tabBarController?.viewControllers 

let navController = viewControllers![0] as! UINavigationController 

let profileViewController = self.storyboard?.instantiateViewControllerWithIdentifier("childViewController") as? ProfileViewController 

profileViewController!.parameter1 = "Value1" 

profileViewController!.parameter2 = "Value2" 

navController.pushViewController(profileViewController!, animated: true) 

self.tabBarController?.selectedIndex = 0 
1

Con Swift:

if let navController = self.tabBarController?.viewControllers?[1] as? UINavigationController{ 
     if let testController = navController.childViewControllers.first as? MyViewController{ 
      testController.data = data 
      self.tabBarController?.selectedIndex = 1 
     } 
} 
Cuestiones relacionadas