UITableView con índices

05 May 2008

En el ejemplo de hoy nos hemos basado en el tercer caso práctico de TableViewSuite de iPhone Dev Center. (Podéis descargarlo en http://developer.apple.com/iphone/library/samplecode/

TableViewSuite/index.html )



UITableView, es una de las clases más utilizadas, pues nos permite mostrar información en forma de lista y puede ser ordenada, agrupada y localizada de forma sencilla.

En el ejemplo de hoy, vamos a mostrar una sencilla lista de zonas horarias, ordenadas por orden alfabético, con la primera letra de cada región como cabecera de la sección y con un índice para acceder de forma rápida.

Para obtener la información de las zonas horarias, en nuestra clase delegada de UIApplication, obtenemos dicha información mediante la clase abstracta NSTimeZone, a través de su propiedad knownTimeZoneNames en una variable de tipo NSArray aunque en nuestro caso preferimos hacerlo con una del tipo NSMutableArray (hereda de NSArray y por lo tanto implementa operaciones básicas de inserción y eliminación de elementos en la lista).

[cpp]NSMutableArray* nuestravariable = [NSTimeZone knownTimeZoneNames];[/cpp]

Hemos preferido NSMutableArray ya que está indicada para el manejo personalizado de la lista, y al ser una subclase de NSArray nos permitirá implementar métodos como:

[cpp]
insertObject:atIndex:
removeObjectAtIndex:
addObject:
removeLastObject
replaceObjectAtIndex:withObject:
[/cpp]

En nuestra clase controladora, heredaremos de UITableViewController para manejar nuestro TableView. Aprovecharemos su método initWithStyle para aplicar un estilo a nuestro TableView (ya visto en nuestra clase delegada de UIApplication con initWithStyle:UITableViewStylePlain). Podéis probar con el estilo UITableViewStyleGrouped y comprobar vosotros mismo el cambio.

-Métodos de UITableViewDataSource
En nuestra clase controladora vamos a sobreescribir algunos métodos necesarios para el correcto funcionamiento de la aplicación. En concreto son de la clase UITableViewDataSource que son llamados a partir del objeto UITableView por medio de eventos.

1. numberOfSectionsInTableView

Método opcional de la clase UITableViewDataSource, que será llamado en el momento que hayamos insertado todos los datos, si nos fijamos en la pila de llamadas a través de:

Como no hay mejor manera de aprender, que comprobar por nosotros mismos ciertos comportamientos, en lugar de devolver el número de secciones de nuestro TableView, pongamos un 2 (return 2;).

2. numberOfRowsInSection

Al igual que el método anterior, a través de UITableViewDataSource, devolvemos el número de regiones de cada sección, el cual es llamado desde:



3. titleForHeaderInSection

Pregunta al DataSource por el título de la cabecera de la sección especificada.

4. sectionIndexTitlesForTableView

Pregunta al DataSource para que devuelva los títulos para las secciones del TableView.

5. sectionForSectionIndexTitle

Pregunta al DataSource para devolver el índice de una sección.

* Si obviamos estos tres últimos métodos, veremos como los datos aparecen de forma plana, sin cabeceras ni índices. Es conveniente comentar cada uno de ellos para ver el resultado y comprender mejor el ejemplo.

-Métodos de UITableView

1. cellForRowAtIndexPath

Devuelve el valor de una determinada fila o celda a partir de un índice.

Para finalizar, una de las funciones más importantes en nuestro ejemplo de hoy es la encargada de rellenar la información que será mostrada. Para ello, mediante un objeto diccionario de la clase NSMutableDictionary nos dispondremos a rellenarlo.
[cpp]
NSMutableDictionary *indexedTimeZones = [[NSMutableDictionary alloc] init]; for (NSString *name in knownTimeZoneNames)

{

// The region name is unused in this example

NSArray *components = [name componentsSeparatedByString:@"/"];

NSString *timeZoneLocaleName = localeNameForTimeZoneNameComponents(components);

NSString *firstLetter = [timeZoneLocaleName substringToIndex:1];

NSMutableArray *indexArray = [indexedTimeZones objectForKey:firstLetter];

if (indexArray == nil)

{

indexArray = [[NSMutableArray alloc] init];

[indexedTimeZones setObject:indexArray forKey:firstLetter];

[indexArray release];

}

NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:name];

NSDictionary *timeZoneDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:timeZone, @"timeZone", timeZoneLocaleName, @"timeZoneLocaleName", nil];

[indexArray addObject:timeZoneDictionary];

}
[/cpp]

El diccionario indexedTimeZones irá rellenando cada una de las letras de las regiones en una variable CFString y en otro diccionario hijo (timeZoneDictionary) las zonas horarias que empiezen por esa letra. A continuación se ordenará el primer diccionario y por cada una de las letras se ordenarán igualmente los diccionarios que contienen (sortUsingDescriptors:sortDescriptors).

Nota: Interesante detalle el de mostrar una imagen nada más iniciar la aplicación, dado que nos lleva un tiempo el cargar la información de las zonas horarias. La imagen es una captura de la propia aplicación, así de esa manera, evitamos un desagradable efecto.
UITableView con índices

Comentarios recientes

  • 05 May 2008
    Iphone » UITableView con índices dijo:

    [...] iPhone Software wrote an interesting post today on UITableView con índicesHere’s a quick excerptEn el ejemplo de hoy nos hemos basado en el tercer caso práctico de TableViewSuite de iPhone Dev Center…. [...]

Deja un comentario

Escrito por:

Administrador

Sin categoría
UIApplicationNSArrayNSMutableArrayNSMutableDictionaryNSTimeZoneUITableViewUITableViewControllerUITableViewDataSource

Utilizamos cookies propias y de terceros para mantener la sesión o sus preferencias, recopilar estadísticas y proporcionar contenidos conforme a sus intereses. Si continua navegando, utiliza los servicios de la web o pulsa el botón, está aceptando su instalación y el uso que hacemos de ellas. Puede obtener más información sobre como revocar su consentimiento o cómo cambiar la configuración en este enlace.