NSDateFormatter crash. ¿Cómo?

NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease]; [timeFormatter setDateFormat:@"h:mm a"]; NSString *fullTime = [timeFormatter stringFromDate:someDateHere]; NSArray *timeParts = [fullTime componentsSeparatedByString:@" "]; timeLabel.text = [timeParts objectAtIndex:0]; ampmLabel.text = [timeParts objectAtIndex:1]; 

La línea ÚLTIMA se cuelga con

  NSRangeException*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0] 

¿Cómo es esto posible? Hay una verificación nula en la date que regresa justo antes de este código.

Desde la documentation de la Guía de formatting de datos (sección Formateadores de date> Usar cadenas de formatting para especificar formattings personalizados> Formatos fijos):

Aunque, en principio, una cadena de formatting especifica un formatting fijo, por defecto NSDateFormater todavía tiene en count las preferences del usuario (incluida la configuration regional). … En iOS, el usuario puede anular la configuration pnetworkingeterminada de AM / PM versus 24 horas. Esto puede hacer que NSDateFormatter reescriba la cadena de formatting que configuró.

En otras palabras, en un dispositivo iOS configurado para la configuration de 24 horas, no obtendrá "6:02 PM", obtendrá "18:02", aunque especificó "h: mm a". Entonces, cuando separas eso por espacios, obtienes un único valor, "18:02", no dos valores.

Hay una advertencia en la documentation para NSDateFormatter que dice:

Tenga en count que, si bien establecer una cadena de formatting ( setDateFormat: en principio especifica un formatting exacto, en la práctica también puede ser anulado por las preferences de un usuario; consulte la Guía de formatting de datos para get más detalles.

¿Podría esto aplicarse en su caso para producir una cadena sin espacios? (Esto llevaría a una matriz de longitud 1 cuando se divide por espacios, con la exception que ve en el lugar donde la ve.) Marque esto ingresando la date formateada o adjuntando un depurador.

Tenga en count que el final de la página en los formattings de date recomienda usar strftime_l antiguo strftime_l cuando se trata de dates / horas no localizadas. Eso podría ser más adecuado para ti. (Además, ¿desea un indicador de AM / PM en los datos que corresponden a una computadora? En serio? El reloj de 24 horas es mucho más fácil de usar, por lo general …)