|
Aquí se explica como usar un NsArray con un UiTableView.
este tutorial es muy recomendable.
Mil gracias a IphoneBlog por estos grandisimos tutoriales.
Ingreso de datos NSArray a un UITableView
Mucha de la gente que tiene cierta experiencia en programación sabrá que existen ciertas estructuras de datos llamados Arrays (o “arreglos” en español). Básicamente nos permiten guardar y acceder a la información de una manera rápida y simple sin tener que hacer hacer uso de una base de datos. Entre las diversas formas de arrays que hay en Objetive-C, vale la pena mencionar dos: NSArray y NSMutableArray. Los dos son muy parecidos, con la diferencia de que en el primero no se modifican los índices después de ser asignados y en el segundo sí se puede.
En este artículo veremos como crear una estructura de datos para mostrarla posteriormente en un UITableView.
Para empezar, abran un nuevo proyecto Navigation-Based Applicacion para iPhone en Xcode y nómbrenlo como “Zoo”.
Una vez hecho esto, vayan a File -> New File y cuando se abra la ventana, seleccionen el icono de NSObject subclass. Presionen Next y nombren a su archivo como “Zoo.m”.
Finalmente hagan clic en Finish. Lo que hicimos fue crear una subclase de la clase NSObject para tener disponibles todos los métodos de la superclase.
Ahora vamos a editar nuestra subclase Zoo.m dentro de la ventana del Xcode y le agregaremos dos propiedades llamadas name y scream.
#import @interface Zoo : NSObject { NSString *name; NSString *scream; // Agregamos las propiedades. } @property (nonatomic, copy) NSString * name; @property (nonatomic, copy) NSString * scream; //Definición de las propiedades de nuestra clase en la interface. Ambas son cadenas de caracteres. - (id)initWithName:(NSString*)n scream:(NSString *)scr; // Aqui se define la función constructora, y vamos a hacer que acepte dos argumentos. @end
Este archivo es lo que se llama la interface de la clase y es donde se definen las propiedades que esta tendrá. Es en otro archivo donde las implementamos y escribimos el código que define su comportamiento. Por defecto, todos los objetos tienen su propia función constructora a menos que desees hacerla mas personalizada.
¿Porqué deseamos personalizarla? Para poder pasarle el name y el scream cuando se crea el objeto.
Abramos el archivo Zoo.m y agreguemos este código:
#import "Zoo.h" @implementation Zoo @synthesize name, scream; // Definimos los getters/setters de nuestras propiedades. - (id)initWithName: (NSString*)n scream:(NSString*) scr { self.name = n; self.scream = scr; //Una vez creado el objeto, tenemos que guardar las variables dentro de las propiedades. return self; //Devolvemos el objeto. } @end
Aquí implementamos el método initWithName y le pasaremos dos variables a través de los argumentos de la función; nombre y grito. Al final, hay una línea muy importante (la número once). Sino fuera por esta línea, el método no devolvería el objeto Zoo que se crea.
Ya con todo esto, nuestro objeto Zoo ha sido definido pero falta ingresarlo en un NSArray. Este artículo de NSArray no estaría completo sino usaramos uno 
Abramos el archivo RootViewController.h y lo modificamos de esta manera:
#import <UIKit/UIKit.h> #import "Zoo.h" @interface RootViewController : UITableViewController { NSArray *animals; // Definimos una serie de propiedades que usaremos. } @property (nonatomic , retain) NSArray *animals; //Otra vez definimos las propiedades y sus características... @end
Para la gente con pocos conocimientos en programación, les comento que estamos creando una propiedad para nuestra clase RootViewController llamada animals el cual un objeto de tipo NSArray. Este dato posteriormente los usaremos dentro de la definición de los métodos en nuestro archivo RootViewController.m, así que vayan abriendolo, dado que le haremos unas modificaciones.
Primero, antes que todo, localicen la línea @implementation RootViewController; y agreguen justo debajo este código:
@synthesize animals; // Creación de los getters/setters.
Synthesize lo que hace es crear automáticamente los métodos getter/setters para las propiedades que definimos. Esto puede llegar a ser importante si deseamos tener una manera para modificar estos datos y responde mucho al concepto de encapsulamiento en la OOP.
Posteriormente, busquen el método viewDidLoad y modifíquenlo de esta forma:
- (void)viewDidLoad { Zoo *cat = [[Zoo alloc] initWithName:@"Firulais" scream:@"MIAU"]; Zoo *dog = [[Zoo alloc] initWithName:@"Lassie" scream:@"GUAU"]; Zoo *bird = [[Zoo alloc] initWithName:@"Piolin" scream:@"PIO"]; // Creamos nuestros objetos Zoo self.animals = [[NSArray alloc] initWithObjects:cat, dog, bird, nil]; // Metemos los objetos Zoo dentro de un NSArray. }
A partir de la línea 4 creamos tres variables/objetos temporales (gato, perro y pajaro) de tipo Zoo, el cuál es la clase que definimos con anterioridad. Como verán, usamos el método initWithName para pasarle los datos de nuestro objeto y configurarlo de manera mas personalizada. Posteriormente, almacenamos estos objetos dentro de un NSArray. Si, por fin apareció el NSArray 
Es importante señalar que el método viewDidLoad se invoca cuando nuestra ventana termina de cargar, lo que nos permite tener listos todos los datos y celdas para crear las filas necesarias en nuestro UITableView.
Ahora busquen el método numberOfRowsInSection y modifiquemos el return.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [animals count]; // Devolvemos el número de índices de nuestro NSArray; }
Esta función devuelve la cantidad de filas en nuestra tabla y le indica al método que veremos después el número de veces que debe ejecutarse dependiendo la cantidad de elementos de nuestro NSArray animals.
Para finalizar, editemos la función cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *MyIdentifier = @"MyIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease]; } Zoo *actual = [animals objectAtIndex:indexPath.row]; // Objeto actual de la fila. indexPath es un argumento que se pasa automáticamente y nos indica el número que devuelve numberOfRowsInSection NSString *name = actual.name; NSString *concatenate = [name stringByAppendingString: @" says: "]; NSString *final = [concatenate stringByAppendingString: actual.scream]; // Concatenación del texto extraído del NSArray. [cell setText:final]; // Metemos el texto dentro del cell. return cell; // Devolvemos el cell. }
A partir de la línea número diez, son las que nos interesan. En este código, creamos una variable/objeto temporal de tipo Zoo llamado actual en el cual se almacenará el índice actual del NSArray en base al argumento indexPath.
En las siguientes tres líneas extraemos el nombre del animal y lo concatenamos con otras cadenas de caractéres. Posteriormente, en la línea 18 invocamos el método setText del objeto cell y le asignamos el valor final que concatenamos.
Ahora sí, le damos en Build and Go y nuestra aplicación está lista 
Post Original
|
0
Comentario
Add