次のようなカレンダーの日付を並べ替えるために使用するコードがあります。
#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:
コードの何が悪いのかわかりません。どんな助けでもいただければ幸いです。
XcodeV4.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
どうやら私は国際的にも働くように自分を変える必要があるようです。