次のようなカレンダーの日付を並べ替えるために使用するコードがいくつかあります。
#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
シミュレーターで実行すれば、すべて問題ありません。デバイスで実行すると、この皮肉なデバッグメッセージが表示されます。
2012-09-19 22:40:13.972 APPNAME [4923:907] * -[__ NSCFCalendar components:fromDate:]:日付をnilにすることはできません
本当に、操作がゼロの日付で何を意味することになっていると思いますか?
今のところ、例外は回避されています。
これらのエラーのいくつかはこの苦情で報告される予定であり、その後の違反は、nilから生じるランダムなことを何でも黙って実行します。今回これが発生したバックトレースは次のとおりです(コンパイラの最適化のために一部のフレームが欠落している可能性があります)。
あなたはそれを笑わなければなりませんが、私のdateFormatFromTemplate:
コードの何が悪いのかわかりません。どんな助けでもいただければ幸いです。
Xcode V4.5の実行
更新:
バックトレース:
0 CoreFoundation 0x39ff0e55 + 84
1 APPNAME 0x00040be1- [MeetingsViewController dateAtBeginningOfDayForDate:] + 140
ですから、私のdateAtBeginningOfDayForDate
方法では事態が悪化していると思います。これは次のようになります:
/*
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;
}
このメソッドを使用して、特定のNSDateをそのコアコンポーネントに分解し、それらすべてをより効率的にソートできるようにします。ただし、私のアプリは国際的である必要がありNSLocale
ます。これが、日付出力のフォーマットに使用する理由です。どうやら私はdateAtBeginningOfDayForDate
国際的にも働くように自分を変える必要があるようです。