4

これが私のコードです:

NSString * calID = [[NSUserDefaults standardUserDefaults] objectForKey:@"calendarIdentifier"];
EKCalendar *cal = [eventStore calendarWithIdentifier:calID];

// If calendar exists
if(cal)
{
    // Retrieve all existing events until today
    NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:[NSDate distantPast] endDate:[NSDate date] calendars:@[cal]];
    self.events = [eventStore eventsMatchingPredicate:predicate];

    if(self.events==nil)
        NSLog(@"nil events!");
 }

calendarItentifier は、プログラムでカレンダーを作成したときに保存した変数であるため、間違ったカレンダーにイベントを追加しているわけではありません。

ただし、このコードはカレンダーの過去のイベントを取得するためには機能せず、self.events に nil を返すだけです。しかし、カレンダーにイベントを追加しました。コードに何か問題があるかどうか教えてもらえますか?

4

3 に答える 3

10

this answerthis postによると、 aと4 年以上離れEKEventStore eventsMatchingPredicate:た述語はサポートされていません。この事実に関する公式ドキュメントは見つかりませんが、実際には、このメソッドは から4 年後までのイベントを返すように見えます。startDateendDateendDatestartDate

[NSDate distantPast]何世紀も前の日付を返すため、それを開始日として述語を作成すると、間違った答えが得られることがほとんど保証されます。

最も簡単な解決策は、コードを次のように変更することです。

NSDate* fourYearsAgo = [NSDate dateWithTimeIntervalSinceNow:-1 * 60 * 60 * 24 * 365 * 4];
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:fourYearsAgo endDate:[NSDate date] calendars:@[cal]];

これがうまくいかない場合は、境界をより賢く選択する方法を見つけるか、探しているものが見つかるまで連続した 4 年述語を作成する必要があります。

于 2013-11-18T18:45:31.120 に答える