2011-06-18 13 views
11

Tengo una aplicación que básicamente lee un archivo xml y muestra los resultados en un UITableView. Estoy intentando agrupar los elementos de la lista por "país" (un atributo de los elementos del archivo xml) y mostrarlos en Secciones UITableView.Secciones de agrupamiento UITableView de NSMutableArray

Actualmente leo el archivo xml y almaceno cada Elemento como un objeto personalizado en un NSMutableArray. La matriz tiene la siguiente estructura:

matriz: 0 => (título, descripción, fecha, país) 1 => (título, descripción, fecha, país) 2 => (título, descripción, fecha, país) 3 => (título, descripción, fecha, país)

He intentado crear otro conjunto de países únicos que me ha permitido crear los encabezados de sección correctamente, pero estoy luchando para encontrar una manera de mostrar el corregir elementos debajo de cada encabezado de sección.

if(![countryArray containsObject:itemCountry]) //if country not already in array 
{ 
    [countryArray addObject:itemCountry]; //Add NSString of country name to array 
} 

Donde itemCountry es el atributo country de cada elemento mientras recorro el archivo xml.

[countryArray count]; //gives me the amount of sections needed 

Así que supongo que mi pregunta es ¿cómo puedo calcular cuántas filas deben ir en cada sección? ¿Cómo se muestran los elementos de matriz correctos para cada sección?

Cualquier ayuda o punteros sería grande

Respuesta

21

En lugar de crear una matriz de objetos personalizados que contengan sus datos, debe considerar crear un diccionario.

NSMutableDictionary * theDictionary = [NSMutableDictionary dictionary]; 

// Here `customObjects` is an `NSArray` of your custom objects from the XML 
for (CustomObject * object in customObjects) { 
    NSMutableArray * theMutableArray = [theDictionary objectForKey:object.country]; 
    if (theMutableArray == nil) { 
     theMutableArray = [NSMutableArray array]; 
     [theDictionary setObject:theMutableArray forKey:object.country]; 
    } 

    [theMutableArray addObject:object]; 
} 

/* `sortedCountries` is an instance variable */ 
self.sortedCountries = [[theDictionary allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

/* Save `theDictionary` in an instance variable */ 
self.theSource = theDictionary; 

Más adelante en numberOfSectionsInTableView:

- (NSInteger)numberOfSectionsInTableView { 
    return [self.sortedCountries count]; 
} 

En tableView:numberOfRowsInSection::

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [[self.theSource objectForKey:[self.sortedCountries objectAtIndex:section]] count]; 
} 

En tableView:cellForRowAtIndexPath::

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    [..] 

    /* Get the CustomObject for the row */ 
    NSString * countryName = [self.sortedCountries objectAtIndex:indexPath.section]; 
    NSArray * objectsForCountry = [self.theSource objectForKey:countryName]; 
    CustomObject * object = [objectsForCountry objectAtIndex:indexPath.row]; 

    /* Make use of the `object` */ 

    [..] 
} 

Esto se debe tomar la WH camino viejo.

Nota al margen
Si no fuera para presentar los datos y acaba de obtener el recuento de los países a continuación, una mejor alternativa al enfoque de pengone es usar un NSCountedSet.

NSCountedSet * countedSet = [NSCounted set]; 
for (NSString * countryName in countryNames) { 
    [countedSet addObject:countryName]; 
} 

Ahora todos los países únicas están disponibles en [countedSet allObjects] y recuento de cada país sería [countedSet countForObject:countryName].

+0

@Michael hágamelo saber si necesita más ayuda con esto. –

+0

Eso funcionó muy bien, gracias – Leo

+1

¿Qué hago para los encabezados de las secciones? – Chrizzz

0

Probablemente no debería crear varias matrices, sino crear una matriz de diccionarios. Así que cree una matriz mutable llamada condados o wtv y diccionarios de anuncios que contengan el título, nombre, etc. Para crear un diccionario, es bastante fácil simplemente crear un objeto NSMutableDictionary y luego usar el método setValue:forKey: para agregarle cosas. Para el nombre del país, el valor sería el nombre y la clave sería por país. Espero que ayude.

+0

El enfoque sugerido por Pete42 sería el que yo usaría. De esta manera puede usar KeyValueCoding para ordenar la matriz, recuperar grupos de países, etc. ... (revise el método valueForKeyPath: en los documentos de Apple, es bastante poderoso). –

3

Para los encabezados de sección utilizando la respuesta de Deepak sólo tiene que ir:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    return [self.sortedCountries objectAtIndex:section]; 
} 
Cuestiones relacionadas