2010-07-24 13 views
5

El trabajo se interpuso en el camino de aprendizaje del Objetivo C, pero estoy de vuelta ahora y esto me está volviendo loco.Objetivo C - NSArray y estructura de bucle For

Este es mi código:

i=0; 
    for (i=0;[photoList count]; i++) { 
     NSLog(@"%i",i); 
     NSLog(@"%@",[photoList objectAtIndex:i]); 
     NSString *fileName = [photoList objectAtIndex:i]; 
     sendImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:nil]]; 
     UIImageWriteToSavedPhotosAlbum(sendImage,self,@selector(savedPhotoImage:didFinishSavingWithError:contextInfo:),NULL);} 

photoList es sólo un NSArray como tal, excepto con 24 objetos:

NSArray* photoList = [NSArray arrayWithObjects:@"Photo 1.jpg", 
    @"Photo 2.jpg", 
    @"Photo 3.jpg", 
    @"Photo 4.jpg",nil]; 

funciona ... Se copia las fotos a la cámara en marcha. .. y luego se estrella con

2010-07-24 19: 34: 36.116 iCardz2go Poindexter [29662: 207] * terminación de aplicación debido a excepción no detectada 'NSRangeException', razón: '* - [NSArray objectAtIndex:]: Índice 24 allá de los límites [0 .. 23]'

que he probado varias configuraciones tales como

for (i=0;1<23; i++) 

sólo para obtener 2010-07-24 19:51 : 01,017 iCardz2go Poindexter [29908: 207] *** terminación de aplicación debido a excepción no detectada 'NSInvalidArgumentException', razón: '+ [NSInvocation invocationWithMethodSignature:]: método argumento firma no puede ser nulo'

Así que ha de leer el cero y el paso eso.

Sé que va a ser algo realmente simple que he olvidado. ¿Por qué no salta el ciclo en la Foto 23 (el recuento)?

¡Su ayuda es muy apreciada! P

+0

¿Cómo puede ser el conteo de 23, si hay 24 objetos? –

+0

Debería abordar un tutorial en el lenguaje de programación C, ya que es de esperar que cubra construcciones como bucles. Objective-C es una capa bastante delgada sobre C, por lo que familiarizarte con C te ayudará a familiarizarte con Objective-C también. – dreamlax

+0

Marcelos - Porque pensé que un NSArray contaba desde 0 ... ¿no es así? –

Respuesta

12

Para bucles en C y mirada Objective-C como esto:

for (initialization; condition; increment) { 
    // body 
} 

initialization es donde se configura el bucle; es donde le dices con qué comenzar. condition se prueba para cada iteración, incluida la primera; si el condition se evalúa como verdadero, se ejecuta el cuerpo del ciclo. Al final de cada iteración, se evalúa increment.

Así:

for (int i = 0; i < 10; i++) { 
    printf("%i\n", i); 
} 

imprimirá los números del 0 al 9. ¿Qué es probable que desee para el suyo es:

NSUInteger count = [photoList count]; 
for (NSUInteger i = 0; i < count; i++) { 
    NSString *fileName = [photoList objectAtIndex: i]; 
    sendImage = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: fileName ofType: nil]]; 
    UIImageWriteToSavedPhotosAlbum(sendImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), NULL); 
} 

Nota la asignación de count fuera del bucle; es simplemente una optimización, por lo que el ciclo no tiene que enviar un mensaje adicional para cada iteración (puede hacerlo fácilmente con i < [photoList count]).

¿Eso le ayuda?

+0

Gracias también. Aún fallando con: Terminación de aplicación debido a la excepción no detectada 'NSInvalidArgumentException', razón: '+ [invocación NSInvocationWithMethodSignature:]: el argumento de la firma del método no puede ser nil' Me está volviendo loco porque no sé lo suficiente como para interpretar el mensaje de error. –

+0

¿Su clase realmente responde a '-savedPhotoImage: didFinishSavingWithError: contextInfo:'? Debes asegurarte de que esté implementado. –

+0

¡GRACIAS! Ese fue el problema! Recuerdo comentarlo probando ... algo ... hace un par de días y bajo y ¡¡¡¡¡todavía estaba comentado !!! Pero debido a que estaba jugando con NSArray por primera vez, y estoy realmente avanzado (¡LOL!) Poniéndolo en un bucle, asumí automáticamente que el problema estaba allí. Su ayuda y las anteriores son enormemente apreciadas por mí y otros novatos. Usualmente puedo encontrar la respuesta solo buscando, pero esto me dejó perplejo. ¡Gracias a todos! Espero que algún día pueda hacer lo mismo con la gente. –

19

¿Por qué no prueba la enumeración rápida?

for (NSString *photoFile in photoList) { 
    NSLog(@"%@", photoFile); 
    sendImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
           pathForResource:photoFile 
             ofType:nil]]; 

    UIImageWriteToSavedPhotosAlbum(sendImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), NULL);} 
} 
+0

¡Gracias! No había oído hablar de la enumeración rápida hasta ahora ... mucho que aprender. Pero al usar su código falla antes de escribir en la cámara con el mismo error: Aplicación de terminación debido a excepción no detectada 'NSInvalidArgumentException', razón: '+ [NSInvocation invocationWithMethodSignature:]: el argumento de firma de método no puede ser nil' –

+0

Eso es diga con el bucle (y hay un error en el código impreso arriba, en realidad, yo <[photoList count] ... pasa por el bucle, escribe las imágenes, luego se cuelga. –

4

Tanto para bucle condiciones — [photoList count] y 1<23 — siempre evalúan a true. Pruebe i < [photoList count]. Mejor aún, usa la respuesta de @Eimantas.

+0

Muchas gracias ... era yo <[photoList count] No sé qué pasó al pegar. Pero eso no lo soluciona. –

+0

Usando i <= [photoList count] se ejecuta y luego se cuelga con: Finalizando la aplicación debido a una excepción no detectada 'NSRangeException', razón: '*** - [NSArray objectAtIndex:]: índice 24 más allá de los límites [0 .. 23]' ¿Eso ayuda a reducir el problema? –

0

Desde su código:

for (i=0;[photoList count]; i++) 

La condición [photoList count] siempre es cierto. No leí toda la discusión, sin embargo.

0

cambio de su declaración a for (i = 0; i < [count photoList]; i ++)