Union de 2 strings

Para dar las gracias debes entrar o registrarte en el foro

iMiembro
iMiembro
Mensajes: 9 Agradecido: 0
03 May 2012, 17:55# 1

Hola a todos, estoy teniendo un problema a la hora de unir dos objetos de tipo NSString y espero que me podais echar una mano. Os explico un poco la situación:

Tengo 2 NSStrings extraidas de un JSON, sus esquemas son los siguientes:
listaImagenes: ( "imagen1.jpg", "imagen2.jpg", "imagen3.jpg" ... )
listaNombres: ( "nombre1", "nombre2", "nombre3", ...)

Mi intención es unirlas en uno solo siguiendo el siguiente esquema. ("nombre1", "imagen1.jpg", "nombre2", "imagen2.jpg", "nombre3", "imagen3.jpg"...), Es decir, que vaya intercalando uno a uno los campos de cada string y no dejarlos ("nombre1", "nombre2", "imagen1", "imagen2"...).

He puesto los colores para que se vea más claro lo que intento hacer, espero que podais ayudarme.
Gracias!!

Gracias  
Etiquetado en:
iMiembro
iMiembro
Mensajes: 14 Agradecido: 0
07 May 2012, 08:27# 2

Hola.

Creo que con un NSDictionary lo tendrías hecho.

El listado de nombres serían las keys y el listado de imágenes los values.

Suerte!

Gracias  
iMiembro
iMiembro
Mensajes: 9 Agradecido: 0
08 May 2012, 08:36# 3

Ha habido algunos cambios en lo que estoy haciendo, ahora lo que tengo es un NSString llamado usersList con la siguiente estructura:
{
createTime = "fecha hora";
fullname = "Nombre de Usuario";
"prof_id" = 5;
thumb = "imagen.jpg";
},
{
//Datos de otro usuario
}...

Tengo que mostrar por pantalla (no en debug area), un listado a dos o tres columnas en el que se muestre la imagen del usuario y su nombre debajo (el del usuario, no el de la imagen).
Para esto necesito crear una estructura o algún tipo de datos en el que se guarden los datos de todos los usuarios pero he visto que con NSDictionary solo guarda pares clave/valor y yo tengo que guardar 4 datos de cada usuario, por lo que creo que esto no me vale.
¿Podeis echarme una mano? Gracias!!

Gracias  
iMiembro 3G
iMiembro 3G
Mensajes: 92 Agradecido: 27
08 May 2012, 11:17# 4

¿Y no puedes hacerlo mediante un NSMutableArray de una objeto propio?. Algo así (escribo de memoria):

Creas tu objeto. En el MiEstructura.h (faltaria el MiEstructura.m)

@interface MiEstructura: NSObject {
NSString* createTime;
NSString *fullName;
..
}

@property (retain) NSString* createTime;
@property (retain) NSString* fullName;
...
@end



Y luego en el viewController creas el array de tus objetos:

MiEstructura *miEstructura = [[MiEstructura alloc] init];
miEstrucutra.fullName = @"Nombre de Usuario";
...

NSMutableArray *miArray = [[NSMutableArray alloc] initWithCapacity: _numObjectos ];
[miArray addObject: miEstructura];
[miEstructura release];
...


Para recuperar los datos simplemente:

MiEstructura *miEstructura = (MiEstructura*)[miArray objectAtIndex: _indexDelObjeto];
miLabel.text = miEstructura.fullname;
...

De esta forma tienes todo el control sobre tu estructura de datos y ademas, al ser un objeto puedes añadirle funcionalidad extra, como comprobaciones en los setters o conversiones automáticas de formato, escribiendo el código solo en un sitio.

Si no necesitas un objeto, puedes crear una estructura de datos (igual que en C) pero se complica si quieres manejarlo desde arrays:
http://stackoverflow.com/questions/3931 ... of-structs

* No respondo cuestiones técnicas por privado. Pon tus preguntas en el foro y así aprendemos todos.
Gracias  
1 persona ha dado las gracias: developer
iMiembro
iMiembro
Mensajes: 9 Agradecido: 0
09 May 2012, 11:10# 5

Me gusta la idea de crear un objeto propio, había leido algo sobre ello pero no he encontrado ninguna explicación clara hasta ahora. Te explico un poco el código que tengo y las dudas que tengo por si pudieras ayudarme:

He creado la clase usersController:

Código: Seleccionar todo
//UsersController.h
#import

@interface UsersController : NSObject{
    NSInteger *prof_id;
    NSString *createTime;
    NSString *fullName;
    NSString *thumb;
}
@property (nonatomic) NSInteger *prof_id;
@property (nonatomic, retain) IBOutlet NSString *createTime;
@property (nonatomic, retain) IBOutlet NSString *fullName;
@property (nonatomic, retain) IBOutlet NSString *thumb;
@end


Código: Seleccionar todo
//UsersController.m
#import "UsersController.h"

@implementation UsersController

@synthesize prof_id;
@synthesize fullName;
@synthesize createTime;
@synthesize thumb;

@end


Código: Seleccionar todo
//Fragmento del ViewController
    //En estos 4 arrays guardo los correspondientes datos extraidos de usersList, que está en formato JSON
    NSArray *userName = [usersList valueForKey:@"fullname"];   
    NSArray *userID = [usersList valueForKey:@"prof_id"];
    NSArray *userThumb = [usersList valueForKey:@"thumb"];
    NSArray *userCreateTime = [usersList valueForKey:@"createTime"]; 
   
    //Declaro Objeto Usuarios
    UsersController *usuarioSimple = [[UsersController alloc] init];
   
    //Array Usuarios al que le iré añadiendo todos los objetos de tipo Usuario
    NSMutableArray *arrayUsuarios = [[NSMutableArray alloc] initWithCapacity: [userID count]];

    NSInteger i;
    for (i=0; i<[userName count]; i++) {
        //Guardo en el objeto usuario los datos extraidos de los JSON userName, userID, userThumb y userCreateTime
        usuarioSimple.prof_id = [userID objectAtIndex:i];
        usuarioSimple.fullName = [userName objectAtIndex:i];
        usuarioSimple.thumb = [userThumb objectAtIndex:i];
        usuarioSimple.createTime = [userCreateTime objectAtIndex:i];
       
        //Guardo en el array de objetos el objeto que acabo de obtener
        [arrayUsuarios addObject:usuarioSimple];
       
    }


El problema que tengo viene a la hora de acceder a algún campo en concreto del array de objetos. Por ejemplo, si quiero guardar en una variable llamada prueba el valor prof_id del 2º objeto del array, ¿cómo tendría que hacerlo? Estoy probando pero no lo consigo.
Gracias!
Gracias  
iMiembro 3G
iMiembro 3G
Mensajes: 92 Agradecido: 27
09 May 2012, 12:08# 6
developer escribió:
El problema que tengo viene a la hora de acceder a algún campo en concreto del array de objetos. Por ejemplo, si quiero guardar en una variable llamada prueba el valor prof_id del 2º objeto del array, ¿cómo tendría que hacerlo? Estoy probando pero no lo consigo.
Gracias!



De nuevo de memoria:

NSInteger * prueba;
prueba = [(UsersController *) [arrayUsuarios objectAtIndex: 1] prof_id];

Es el segundo objeto del array, pero el index comienza por 0,1,2 ...., n-1.


De todas formas, no he probado tu código, pero creo que no estas guardando bien los objetos en el array, ya que solo reservas memoria para el primer objeto.
Debes reservar un espacio de memoria distinto para cada objeto (alloc), por lo que me da que en el array estas metiendo muchas veces el mismo objecto y sobrescribes su valor en cada iteraccion del for, por lo que hagas la consulta que hagas, al estar siempre apuntando al mismo sitio en la memoria, solo obtendrás lo ultimo que hayas metido.

Prueba algo asi:

UsersController *usuarioSimple; //Objecto nulo, es solo un puntero a nada

for (i=0; i<[userName count]; i++) {

usuarioSimple = [[UsersController alloc] init]; //Reservas espacio para el nuevo objeto

usuarioSimple.prof_id = [userID objectAtIndex:i];
usuarioSimple.fullName = [userName objectAtIndex:i];
usuarioSimple.thumb = [userThumb objectAtIndex:i];
usuarioSimple.createTime = [userCreateTime objectAtIndex:i];

//Guardo en el array de objetos el objeto que acabo de obtener
[arrayUsuarios addObject:usuarioSimple]; //Anades al array un puntero al objeto (no el objeto en si). El array se encarga de marcar la memoria como ocupada ( incrementa el retain count)

[usuarioSimple release]; //Liberas el objeto, tu ya no lo gestionas, lo gestiona el array.

}
* No respondo cuestiones técnicas por privado. Pon tus preguntas en el foro y así aprendemos todos.
Gracias  
1 persona ha dado las gracias: developer
iMiembro
iMiembro
Mensajes: 9 Agradecido: 0
09 May 2012, 12:42# 7

Lo he dejado así:


Código: Seleccionar todo
    NSMutableArray *arrayUsuarios = [[NSMutableArray alloc] initWithCapacity: [userID count]];
   
    //[arrayUsuarios addObject:listaUsuarios];
    NSInteger i;
    UsersController *pruebaConsulta = [[UsersController alloc] init];
    UsersController *usuarioSimple;
    for (i=0; i<[userName count]; i++) {
        //Declaro Objeto Usuarios
        usuarioSimple = [[UsersController alloc] init];
       
        //Guardo en el objeto usuario los datos extraidos de los JSON userName, userID, userThumb y userCreateTime
        usuarioSimple.prof_id = [userID objectAtIndex:i];
//        NSLog(@"prof_id: %@\n", usuarioSimple.prof_id);
        usuarioSimple.fullName = [userName objectAtIndex:i];
//        NSLog(@"fullName: %@\n", usuarioSimple.fullName);
        usuarioSimple.thumb = [userThumb objectAtIndex:i];
//        NSLog(@"thumb: %@\n", usuarioSimple.thumb);
        usuarioSimple.createTime = [userCreateTime objectAtIndex:i];
//        NSLog(@"createTime: %@\n\n", usuarioSimple.createTime);
       
        [arrayUsuarios addObject:usuarioSimple];
       
        usuarioSimple = [arrayUsuarios objectAtIndex:i];
        NSLog(@"usuarioSimple.prof_id[%@]:    %@",i, usuarioSimple.prof_id);
        NSLog(@"usuarioSimple.fullName[%@]:   %@",i, usuarioSimple.fullName);
        NSLog(@"usuarioSimple.thumb[%@]:      %@",i, usuarioSimple.thumb);
        NSLog(@"usuarioSimple.createTime[%@]: %@\n",i, usuarioSimple.createTime);
        [usuarioSimple release];

    }

Los NSLog comentados funcionan bien, muestran todos los valores de todos los usuarios.
Creo que el problema viene por el valor de i, ya que me muestra por consola lo siguiente:
[1505:f803] usuarioSimple.prof_id[(null)]: 504
[1505:f803] usuarioSimple.fullName[(null)]: Hugo Huff
[1505:f803] usuarioSimple.thumb[(null)]: 4f664efc1b6011cea74acc77eb32367f1d6e73cec671c76a63e95399.jpg
[1505:f803] usuarioSimple.createTime[(null)]: 2012-04-26 11:54:59

La asignación funciona porque muestra los resultados (por lo menos el del primero), pero fíjate que donde tendría que poner el valor de i, pone null. Puede que sea este el problema ya que tras mostrar esto, peta y sale el mensaje de EXC_BAD_ACCESS en la linea del primer NSLog (de los que no están comentados). ¿Por qué puede ser esto?
Gracias  
iMiembro
iMiembro
Mensajes: 9 Agradecido: 0
09 May 2012, 21:23# 8

Creo que he detectado otro problema, pero no se cómo solucionarlo. Cuando inicializo una variable con el valor [userName count], [userID count], [userThumb count] o [userCreateTime count] e intento imprimirlo por pantalla, salta el error, ¿cómo debería de inicialzarlo para corregirlo?
Con este poblema y el de la declaración de la variable i que uso en el for me estoy volviendo loco.
Espero que me podais ayudar.
Gracias!!

Gracias  
iMiembro
iMiembro
Mensajes: 9 Agradecido: 0
10 May 2012, 16:45# 9

Ya lo he solucionado, por si a alguien le sirve es que para mostrar números enteros con NSLog no hay que usar %@ sino %i ó %d.

Yo no lo sabía y me ha desesperado por momentos.

Gracias  
iMiembro Pro 3G
iMiembro Pro 3G
Mensajes: 1221 Agradecido: 440
10 May 2012, 16:56# 10

Leyendoos,creo que seriais capaces de descifrar jeroglíficos sin problemas,que envidia no saber programar.....

Gracias  

Publicidad
Publicidad