83

次のようなカレンダーの日付を並べ替えるために使用するコードがあります。

#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どうやら私は国際的にも働くように自分を変える必要があるようです。

4

2 に答える 2

16

投稿したコードではエラーは発生しません。それはあなたがどこかにあるはずの何かを持っていることを意味しNSDate、代わりにそれはnilです。

エラーメッセージのユーモアについては、私はそのメッセージを見たことがありませんが、Appleに+1します。ココア部門のエンジニアの中には、アップルが昔から持っていた古き良きエンジニアと同じくらい面白い人もいます。

http://www.netfunny.com/rhf/jokes/91q3/cerrors.htmlを吐き出すために使用されたAppleのMPWCコンパイラの種類の診断を確認してください

于 2012-09-20T04:05:07.567 に答える
6

私がこれを理解するのを手伝ってくれた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]];

ただし、問題は、文字列の日付を渡す前に日付形式をローカライズしていたことです。私の場合NSDateFormatter、ローカライズした後は次のようになりました。

MMM dd, yyyy, HH:mm

ローカライズ後のフォーマットは、ローカライズ後にさまざまな方法で表示される可能性があります。

したがって、の形式の文字列を渡すと、HH:mm dd MMM yyyyが返されていましたnil

これは今明らかです -.-

したがって、日付を作成するときにローカライズする代わりに、標準形式の。で日付を作成しますHH:mm dd MMM yyyyNSDate次に、表示するときに、ユーザーのそれぞれのロケールに合わせてフォーマットします。

于 2012-09-20T05:11:16.397 に答える