2010-03-02 9 views
20

Tengo siguiente problema:iPhone: Cómo pasar los datos entre varios Viewcontrollers en una aplicación Tabbar

he construido una aplicación de barra de pestañas con 4 pestañas. Quiero pasar un objeto/variable del primer controlador de pestañas al tercero e inicializar este controlador con el objeto correspondiente.

Ya he hecho algunas investigaciones. La mejor manera, que corresponde a un enfoque de modelo limpio, sería llamar a algún método initWithObject: en el viewcontroller llamado. ¿Cómo puedo lograr esto? ¿Cómo puedo llamar al método init del receivercontroller dentro del controlador de llamadas? ¿Me puede dar algún ejemplo de código?

Editar: Para pasar datos entre varias vistas/clases, etc. simplemente cree algún tipo de clase de datos que contenga la información compartida entre varias clases. Para más información siga el enlace: Singleton

Respuesta

28

Necesita un objeto de modelo de datos que almacene los datos para la aplicación.

Un modelo de datos es un objeto personalizado e independiente al que se puede acceder desde cualquier lugar de la aplicación. El objeto del modelo de datos no sabe nada sobre las vistas o los controladores de vista. Simplemente almacena datos y las relaciones lógicas entre esos datos.

Cuando diferentes partes de la aplicación necesitan escribir o leer datos, escriben y leen el modelo de datos. En su caso, view1 guardará sus datos en el modelo de datos cuando se descargue y luego view2 leerá esos datos del modelo de datos cuando se carga (o viceversa).

En una aplicación diseñada correctamente, no hay dos controladores de vista debería tener acceso a los datos internos de otro controlador. (La única razón por la que un controlador de vista necesita saber de la existencia de otro controlador es si tiene que desencadenar la carga de ese otro controlador.)

La manera rápida y sucia para crear un modelo de datos es añadir atributos al delegado de la aplicación y luego llamar al delegado de la aplicación de los controladores de vista usando:

YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate]; 
myLocalProperty = appDelegate.someDataModelProperty; 

Esto funcionará para proyecto pequeño pero a medida sus datos se vuelven complejos, debe crear una clase dedicada para su modelo de datos.

Editar:

Para aclarar para su caso específico, se agregaría la llamada al modelo de datos cuando el receptor se activa viewController.

La colocación de los datos en un método init o viewDidLoad no funcionará porque en un UITabBar los usuarios pueden alternar sin descargar la vista o reiniciar el controlador de vista.

El mejor lugar para recuperar datos cambiantes es en el método de controlador viewWillAppear. De esta forma, los datos se actualizarán cada vez que el usuario cambie a esa pestaña.

+1

Muchas gracias. Uso ahora el enfoque singleton. También publiqué un enlace a un buen tutorial que describe los pasos que se deben seguir para crear un modelo de datos único. –

4

Es posible que desee considerar NSNotificationCenter (Reference); registra el viewcontroller con el centro de notificaciones de la aplicación y envía una notificación cuando se realiza una selección. Cuando se recibe la notificación, el otro viewcontroller se actualiza en consecuencia.

+0

Eso es cierto, pero creo que no se pueden pasar objetos a través de NSNotificationCenter. Entonces podría enviar alguna Notificación al receiverController. Pero todavía tengo el problema de que necesito mis parámetros init para iniciar el nuevo controlador de visualización. –

+4

Estaría equivocado. Puede perfectamente pasar objetos a través de 'NSNotificationCenter'. Puedes usar, por ejemplo; '- (void) postNotificationName: (NSString *) objeto notificationName: (id) notificationSender userInfo: (NSDictionary *) userInfo', o simplemente' + (id) notificationWithName: (NSString *) aName object: (id) anObject' –

0

No creo que esta es la mejor práctica (también comprobar la sintaxis) sin embargo he salido con:

en el .h

otherclassref *otherclassname 

@property (assign) otherclassname otherclassref; 

y en el .m

@synthesize otherclassref; 

luego solo asigno la referencia desde algún lugar conveniente, por ejemplo el delegado de la aplicación o donde sea que esté instanciando su viewcontrollers.

luego el controlador de vista puede obtener una referencia al otro controlador de vista.

Agrego @class secondviewcontroller al archivo .h para el firstviewcontroller y pongo el #imports "secondviewcontroller.h" en el archivo .m del primer controlador de vista. Se denominan referencias directas y evitan los errores del compilador que resultan de tener archivos .h haciendo referencia entre sí.

+0

This funcionará, pero no es una buena práctica porque la complejidad de las referencias entre los controladores de vista aumentará como la nieve al agregar vistas. Agregar o eliminar una vista de controladores significa actualizar varias otras. Un controlador de vista puede modificar los datos almacenados en otro. – TechZen

+0

@TechZen Sí me parece razonable – PeanutPower

Cuestiones relacionadas