Tengo un código que uso para ordenar las fechas del calendario que se ve así:
#if !(TARGET_IPHONE_SIMULATOR)
NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
locale:[NSLocale currentLocale]];
[fmt setDateFormat:formatString];
#else
[fmt setDateFormat:@"HH:mm dd MMM yyyy"];
#endif
Si lo ejecuto en el simulador, todo está bien. Si lo ejecuto en el dispositivo, aparece este sarcástico mensaje de depuración.
2012-09-19 22: 40: 13.972 APPNAME [4923: 907] * - [__ NSCFCalendar components: fromDate:]: la fecha no puede ser nula
En realidad, ¿qué crees que significa esa operación con una fecha nula?
Se ha evitado una excepción por ahora.
Algunos de estos errores se informarán con esta queja, luego otras violaciones simplemente harán en silencio cualquier cosa aleatoria que resulte del nulo. Aquí está el rastreo donde esto ocurrió esta vez (algunos marcos pueden faltar debido a las optimizaciones del compilador):
Tienes que reírte de eso, pero no estoy seguro de qué está mal con mi dateFormatFromTemplate:
código. Cualquier ayuda sería apreciada.
Ejecutando Xcode V 4.5 por cierto
ACTUALIZAR:
Traza atrás:
0 CoreFoundation 0x39ff0e55 + 84
1 APPNAME 0x00040be1 - [MeetingsViewController dateAtBeginningOfDayForDate:] + 140
Así que supongo que las cosas van mal con mi dateAtBeginningOfDayForDate
método. Que se ve así:
/*
Break down a given NSDate to its bare components for sorting
*/
- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate
{
// Use the user's current calendar and time zone
NSCalendar *calendar = [NSCalendar currentCalendar];
NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
[calendar setTimeZone:timeZone];
// Selectively convert the date components (year, month, day) of the input date
NSDateComponents *dateComps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:inputDate];
// Set the time components manually
[dateComps setHour:0];
[dateComps setMinute:0];
[dateComps setSecond:0];
// Convert back
NSDate *beginningOfDay = [calendar dateFromComponents:dateComps];
return beginningOfDay;
}
Utilizo este método para dividir un NSDate dado en sus componentes principales para poder ordenarlos todos de manera más eficiente. Sin embargo, mi aplicación tiene que ser internacional, que es la razón por la que se usa NSLocale
para formatear la salida de fecha. Por lo que parece, tendré que modificar mi dateAtBeginningOfDayForDate
para trabajar también internacionalmente.
fuente
formatString
?inputDate
debe sernil
. Mire los marcos de la pila superior y vea si puede averiguar qué podría enviar lanil
fecha de entrada.Respuestas:
El error no ocurre en el código que publicó. Significa que en algún lugar tienes algo que se supone que es un
NSDate
y en su lugar lo esnil
.En cuanto al humor en el mensaje de error, nunca he visto ese mensaje, pero +1 a Apple. Algún ingeniero de la división Cocoa es tan divertido como los buenos ingenieros que Apple solía tener hace mucho tiempo.
Vea el tipo de diagnóstico que el compilador MPW C de Apple solía escupir http://www.netfunny.com/rhf/jokes/91q3/cerrors.html
fuente
[fmt setDateFormat:@"HH:mm dd MMM yyyy"];
funciona bien. Así que supongo que esodateFormatFromTemplate:
está mal de alguna manera.Muchas gracias a nneonneo por ayudarme a resolver esto.
Mi problema es que mi aplicación tiene que funcionar a nivel internacional, por lo que necesitaba que se mostraran las fechas con respecto a la ubicación del usuario. Pensé que simplemente crearía una
NSDateFormatter
configuración regional para los usuarios y luego pasaría una fecha de cadena como esta:NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0 locale:[NSLocale currentLocale]]; date = [fmt dateFromString:[NSString stringWithFormat:@"%@ %@", obj.meetingTime, obj.meetingDate]];
Sin embargo, el problema es que estaba localizando el formato de fecha antes de pasar la fecha de la cadena. En mi caso se
NSDateFormatter
veía así después de la localización.Que el formato después de la localización podría verse de muchas formas diferentes después de la localización.
Entonces, pasar una cadena con un formato de
HH:mm dd MMM yyyy
estaba causando que regresaranil
.Lo cual es obvio ahora -.-
Entonces, en lugar de localizar cuando creo la fecha, creo las fechas con un formato estándar de
HH:mm dd MMM yyyy
. Luego, al mostrarlo, le doy formatoNSDate
a la configuración regional respectiva del usuario.fuente