次のようなカレンダーの日付をソートするために使用するコードがいくつかあります。
#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 V 4.5 btwの実行
更新:
バックトレース:
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
を国際的にも動作するように変更する必要があります。
nneonneo に感謝します。
私の問題は、アプリが国際的に機能する必要があるため、ユーザーの場所に関する日付を表示する必要があることです。私はユーザーのロケールにNSDateFormatter
を作成し、次のような文字列の日付を渡すだけだと考えました。
NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
locale:[NSLocale currentLocale]];
date = [fmt dateFromString:[NSString stringWithFormat:@"%@ %@", obj.meetingTime, obj.meetingDate]];
ただし、問題は、日付形式をローカライズしていたことですbefore文字列dateを渡しました。私の場合、ローカライズ後、NSDateFormatter
は次のようになりました。
MMM dd, yyyy, HH:mm
ローカライズ後のフォーマットは、ローカライズ後のさまざまな方法に見えます。
したがって、HH:mm dd MMM yyyy
の形式の文字列を渡すと、nil
が返されます。
今明らかなのは-.-
したがって、日付を作成するときにローカライズする代わりに、HH:mm dd MMM yyyy
の標準形式で日付を作成します。次に、表示するときに、NSDate
をユーザーのそれぞれのロケールに合わせてフォーマットします。
投稿したコードではエラーは発生しません。それは、あなたがNSDate
であるはずの何かを持っていることを意味し、代わりにnil
です。
エラーメッセージのユーモアに関しては、私はそのメッセージを見たことがありませんが、アップルに+1しました。 Cocoa部門の一部のエンジニアは、古き良きエンジニアと同じくらいおかしいですApple昔は.
AppleのMPW Cコンパイラが吐き出すのに使用した診断の種類を確認してください http://www.netfunny.com/rhf/jokes/91q3/cerrors.html