transito schoolwork conduccion colombia aula apple app iphone ios ipad model-view-controller model
http://dl.dropbox.com/u/1232650/linked//SimpleModel.zip

iphone - schoolwork - aula app web



Cómo lidiar con las clases modelo en la aplicación iOS (3)

Soy un novato en el desarrollo de aplicaciones iOS, pero estoy tratando de aprender a tratar con Cocoa de la mejor manera.

Me quedé atrapado tratando de entender cómo mantener y hacer referencia a los objetos modelo correctamente.

  1. muchos dicen escribir una propiedad de delegado de aplicación para contener el modelo y luego consultarlo a través de los métodos de conveniencia para el delegado de aplicación singleton.
  2. otros dicen "inyectar" en el controlador de visualización solo la parte del modelo que necesita (o sus necesidades de subvistas), pero no entiendo cómo hacerlo. A través de una propiedad? A través de un método initWithModel: (y en este caso, ¿cómo puedo decirle a IB que use ese método?)
  3. otros dicen nuevamente que el modelo debe ser un singleton
  4. y otra vez, otros dicen usar variables globales (!)

¿Podría darme alguna pista (y ejemplos de código)? Me gustaría aprender las cosas de la manera adecuada, teniendo en cuenta que pronto me desplazaré hacia Core Data.


Soy un novato también, pero esto es lo que hice. Es más como # 2.

En applicationDidFinishLaunching, el delegado de la aplicación crea una instancia del modelo.

Mis controladores de vista declaran una propiedad que apunta al modelo, pero el tipo es un protocolo (en mi caso id <GameModel> . Muchas de las propiedades en el protocolo se declaran como de solo lectura.

En applicationDidFinishLaunching, el delegado de la aplicación establece la propiedad para que apunte al modelo que creó.

Lo que no me gusta de:

Uno. Los controladores de vista no deberían tener que conocer la estructura del delegado de su aplicación. Puede reutilizar el mismo controlador de vista en otra aplicación, con un tipo de delegado de aplicación diferente. Podrías hacer cambios simples en el código del controlador de tu vista para arreglarlo, o hay otras formas de evitarlo, pero ¿por qué hacerlo difícil?

Tres. No soy tan aficionado a los singletons como la mayoría de las personas. El problema es que están solteros. ¿Qué pasa si quieres tener múltiples modelos cargados?

Las cuatro. ?!?!


Los colegas más experimentados recomiendan tener propiedades relevantes en AppDelegate. OMI es mejor usar un conjunto específico de modelos en un controlador específico.


Resumen : Leí detenidamente el tema Dónde colocar la "Pila de datos básicos" en una aplicación Cocoa / Cocoa Touch sugerida por Brad Larson y escribí una posible solución sobre cómo lidiar con un modelo y diferentes controladores de visualización. La solución no utiliza Core Data, pero creo que el mismo diseño se puede aplicar a las aplicaciones de Core Data.

Escenario : consideremos una aplicación simple que almacena información sobre productos, como el nombre, la descripción y el precio / unidad. Una vez lanzada, la aplicación muestra una lista de productos (con una UITableView); cuando el usuario toca un nombre de producto, la aplicación presenta detalles del producto en otra vista, actualizando la barra de navegación con el nombre del producto.

Arquitectura El modelo es bastante simple aquí: una matriz de objetos de Producto, cada uno con un nombre, una descripción y una propiedad de precio.

La aplicación tiene tres vistas principales, principalmente creadas por la plantilla de navegación de Xcode: un UINavigationView (administrado por el UINavigationController, instanciado en el delegado de la aplicación), el UITableView predeterminado (administrado por RootViewController y que es la primera vista mostrada por el UINavigationController) y un DetailView (administrado por la clase DetailViewController que tenemos que escribir).

Veamos cuál es el gran plan desde el punto de vista del modelo:

  1. El delegado de la aplicación crea una instancia / carga del modelo como NSMutableArray de los objetos del Producto;
  2. El puntero al modelo ahora se pasa al primer controlador de vista de nuestra jerarquía, UITableViewController, a través de una propiedad. En realidad, se podría argumentar que el primer controlador en la jerarquía es el UINavigationController, por lo que deberíamos pasar la referencia a él y desde él al UITableViewController pero ... Apple dice que UINavigationController no debe ser subclasificado, por lo que no podemos agregar ninguna propiedad /método. Y en realidad tiene sentido, porque la responsabilidad de un UINavigationController es siempre la administración de la visualización, no la manipulación del modelo.
  3. Cuando el usuario selecciona una UITableCell, el UITableViewController crea un nuevo DetailViewController (con DetailView asociado), pasa el único producto seleccionado como una propiedad y empuja el DetailView en la parte superior de la pila UINavigation.

Aquí algunos fragmentos de código:

Creación del modelo:

// SimpleModelAppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // products is a protected ivar products = [[NSMutableArray alloc] init]; Product *p1 = [[Product alloc] initWithName:@"Gold" andDescription:@"Expensive metal" andUnitPrice:100]; Product *p2 = [[Product alloc] initWithName:@"Wood" andDescription:@"Inexpensive building material" andUnitPrice:10]; [products addObject:p1]; [products addObject:p2]; [p1 release]; [p2 release]; // Passing the model reference to the first shown controller RootViewController *a = (RootViewController*)[self.navigationController.viewControllers objectAtIndex:0]; a.products = products; // Add the navigation controller''s view to the window and display self.window.rootViewController = self.navigationController; [self.window makeKeyAndVisible]; return YES; } - (void)dealloc { // The app delegate is the owner of the model so it has to release it. [products release]; [_window release]; [_navigationController release]; [super dealloc]; }

RootViewController puede recibir la referencia del modelo, ya que tiene una propiedad NSMutableArray:

// RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UITableViewController @property (nonatomic, retain) NSMutableArray *products; @end

Cuando el usuario toca el nombre de un producto, RootViewController crea una instancia de un nuevo DetailViewController y le pasa la referencia al único producto usando nuevamente una propiedad.

// RootViewController.m - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; // Passing the model reference... detailViewController.product = [products objectAtIndex:indexPath.row]; [self.navigationController pushViewController:detailViewController animated:YES]; [detailViewController release]; }

Y, al final, DetailViewController muestra la información del modelo configurando sus salidas en el método viewDidLoad.

// DetailViewController.m - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = product.name; self.descriptionLabel.text = product.description; self.priceLabel.text = [NSString stringWithFormat:@"%.2f eur", product.unitPrice]; }

Puede descargar el proyecto completo aquí: http://dl.dropbox.com/u/1232650/linked//SimpleModel.zip

Realmente agradeceré cualquier comentario a mi solución, estoy ansioso por aprender;)