AVISO: Cualquier pregunta que no cumpla ninguno de estos criterios podrá ser borrada sin previo aviso.

Quiero rellenar una tabla con datos obtenidos de una BD, pero estoy teniendo un pequeño problema. El servidor me devuelve un objeto:

{"0":{"idpartido":"1","idlugar":"1","fecha":"2012-08-15","hora":"10:00:00","pista":"1","jugadores":"0"},"1":{"idpartido":"2","idlugar":"1","fecha":"2012-08-09","hora":"11:30:00","pista":"1","jugadores":"0"}}

Cuando me llega a la aplicación, primero lo metí en un NSArray, pero me di cuenta de que así no puedo acceder a los datos a través de su key, así que lo metí en un NSDictionary. Lo muestro en el NSLog y efectivamente me devuelve los datos.

Ahora llego al método para llenar las celdas y es cuando no me rellena nada, pongo:

cell.Fecha.text = [partidos2 objectForKey:@"fecha"];

Pero no me muestra nada, poniendo:

NSLog(@"%@",[partidos2 objectForKey:@"hora"]);

Me devuelve (null), sé que rellenar tablas es algo básico, no es la primera vez que relleno una tabla, pero si que es la primera que lo hago desde un NSDictionary creado a través de JSON.

¿Cómo lo puedo hacer? He leído una pregunta similar en este mismo foro pero no me ha servido.

Muchas gracias.

EDITO: Por cierto, para el JSON uso el Framework del SDK de iOS5, no uso ninguno no oficial como el SBJSon o el JSonKit

preguntado 02 Ago '12, 11:44

Sexto's gravatar image

Sexto
86101828

editó 02 Ago '12, 11:52


El objeto raiz que se genera es un NSDictionary con los índicas "0", "1", cada uno de estos índices corresponde a otro objeto NSDictionary donde tienes los datos.

Por ello para acceder a cada elemento debes hacer lo siguiente:

NSDictionary* object = [partidos2 objectForKey:"0"]; // Primer objeto
cell.Fecha.text = [object valueForKey:"fecha"];
enlace permanente

respondido 02 Ago '12, 12:21

madcato's gravatar image

madcato
5511312

Muy bien, ha funcionado, aunque con una pequeña modificación para que me coja todos los objetos: NSDictionary* partido = [partidos2 objectForKey:[NSString stringWithFormat:@"%d",indexPath.row]];

Muchas gracias.

(02 Ago '12, 12:30) Sexto

Buenas,

Yo te recomendaría que te crearas una clase que sea del mismo tipo que cada objeto padre de la respuesta de JSON, en tu caso creo que por ejemplo sería "Partido".

Con el NSDictionary me voy recorriendo el JSON y voy dando valor a mis propiedades de cada partido, tantos como objetos complejos te devuelva el JSON.

Al finalizar esto, créate un NSMutableARRay o NSArray que contenga tantos objetos partidos como tengas, y así en la tabla ya rellenas los datos a partir de este NSMutableArray.

Saludos!

enlace permanente

respondido 02 Ago '12, 11:52

KoldoMac's gravatar image

KoldoMac
272111624

Soy novatillo, hago mis cosas pero aprendo de mis errores. La clase Partido, subclase de NSObject?

(02 Ago '12, 12:04) Sexto

Si, eso es!

(02 Ago '12, 12:17) KoldoMac

Me he dado cuenta de una cosa viendo esto: http://stackoverflow.com/questions/6219156/asynchronous-data-in-nstableview

He probado, en vez de meter los datos en un NSDictionary los he metido en un NSArray, después creo un NSDictionary con cada uno de los partidos:

NSDictionary *partido = [partidos objectAtIndex:indexPath.row];

(Realmente no dejan de ser "pseudobjetos" parecido a lo que me has dicho tu). Y luego hago esto:

cell.Fecha.text = [partido objectForKey:@"fecha"];

Pero me sale error en tiempo de ejecución (SIGABRT)

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6db08c0'

(02 Ago '12, 12:20) Sexto

¿Estás seguro de que [partidos objectAtIndex:indexPath.row] te está devolviendo un diccionario?

Te recomiendo que hagas lo que te ha dicho KoldoMac. Creo que es lo más elegante y personalmente la opción que siempre utilizo para hacer estas cosas. Los pasos a seguir podrían ser estos:

  1. Crea una clase Match que herede de NSObject para almacenar la información de un partido en concreto (en tu caso la información sería idPartido, lugar, fecha, etc...).

  2. Crea una clase MatchsParser (también hereda de NSObject) que se encargue exclusivamente de parsear los datos de los partidos que te llegan en el JSON. Tendrá método de clase parseDataWithJson: (recibiría un parámetro con el json a parsear en un NSString). Ese método te devolvería un NSArray de objetos Match listo para poder utilizarlo en tu tableView. La implementación del método podría ser la siguiente:


+ (NSArray *)parseDataWithString:(NSString *)_jsonData
{
    // Parseamos el json con el framework que quieras (aqui pongo el ejemplo del framework SBJson que es el que utilizo yo)
    NSDictionary *parsedData = [_jsonData JSONValue];

// Creamos un NSMutableArray para ir almacenando los objetos Match
    NSMutableArray *mutableArray = [NSMutableArray array];

// Recorremos todas las claves del diccionario (0, 1, 2, etc...)
    for (NSString *key in [parsedData allKeys])
    {
        // Cogemos los datos del partido
        NSDictionary *matchData = [parsedData objectForKey:key];

// Creamos un objeto Match (el método initWithData: recibiría un NSDictionary con los datos de un partido y devolvería un objeto Match con los datos del partido) 
        Match *match = [[Match alloc] initWithData:matchData];

// Añadimos objeto Match al mutable array
        [mutableArray addObject:match];
    }

// Finalmente devolvemos la lista de partidos que hemos parseado
    return [NSArray arrayWithArray:mutableArray];
}

Ya solamente quedaría llamar al método anterior cuando quieras parsear los partidos que recibes en un JSON y ahí tendrías un NSArray listo para utilizar en un tableView.

¡Saludos!

enlace permanente

respondido 05 Ago '12, 11:57

Daedalus's gravatar image

Daedalus
37117

Tu respuesta:
Activar/desactivar vista previa

Sobre esta pregunta

Etiquetas de la pregunta:

×44
×17
×12

Pregunta realizada el: 02 Ago '12, 11:44

Pregunta visitada: 613 veces

Última modificación: 05 Ago '12, 11:57

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Realizar Donación