1. ホーム
  2. ios

[解決済み] このiOSはどんな嫌味なエラーなのか?

2023-07-27 20:04:57

質問

私は、カレンダーの日付を並べ替えるために、次のようなコードを使用しています。

#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

シミュレータで実行すると、すべてOKです。デバイス上で実行すると、この嫌味なデバッグメッセージが表示されます。

2012-09-19 22:40:13.972 appname [4923:907] *。 -[__NSCFCalendar components:fromDate:]: 日付をnilにすることはできません。

私は本当に、あなたは何を意味するのでしょうか? この操作で日付がnilだとどうなるんだろう?

とりあえず例外は回避されました。

これらのエラーのうちのいくつかは、この苦情と一緒に報告されることになります。 そして、さらなる違反は単に を無言で実行します。以下は、今回これが発生した 今回発生したバックトレースです(コンパイラの最適化により、いくつかのフレームが欠落している可能性があります) バックトレースです (コンパイラの最適化により、いくつかのフレームが欠落しています)。

笑うしかないのですが、私の dateFormatFromTemplate: のコードに問題があるのかわかりません。どんな助けでも感謝します。

Xcode V 4.5 を実行中です。


UPDATEです。

<ブロッククオート

バックトレースです。

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]];

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

MMM dd, yyyy, HH:mm

私はローカライズ後のフォーマットは、ローカライズ後にさまざまな方法で見ることができます。

という書式で文字列を渡すと HH:mm dd MMM yyyy という形式の文字列を渡すと nil .

今となっては当たり前のことですが -.-

そこで、日付を作成するときにローカライズするのではなく、標準的な書式である HH:mm dd MMM yyyy . そして、表示するときに NSDate をそれぞれのユーザーのロケールに合わせます。