5

いくつかのイベントを含むカレンダーを作成しましたが、開始日または終了日がわからなくても、そのカレンダーからすべてのイベントを取得したいと思います。

すべてのカレンダーからすべてのイベントを取得して試したコードなので、後でカレンダーIDで分割できます。

NSPredicate *fetchCalendarEvents = [eventStore predicateForEventsWithStartDate:[NSDate distantPast] endDate:[NSDate distantFuture] calendars:eventStore.calendars];

NSArray *allEvents = [eventStore eventsMatchingPredicate:fetchCalendarEvents];

これにより、データベースにカレンダーのイベントが明確に表示されている間にallEvents戻ります。nil

誰かが私を助けることができますか?

4

2 に答える 2

6

私は今それを動かしています。

これは私が使用しているコードです:

NSDate* endDate =  [NSDate dateWithTimeIntervalSinceNow:[[NSDate distantFuture] timeIntervalSinceReferenceDate]];
NSArray *calendarArray = [NSArray arrayWithObject:cal];
NSPredicate *fetchCalendarEvents = [eventStore predicateForEventsWithStartDate:[NSDate date] endDate:endDate calendars:calendarArray];
NSArray *eventList = [eventStore eventsMatchingPredicate:fetchCalendarEvents];

for(int i=0; i < eventList.count; i++){

    NSLog(@"Event Title:%@", [[eventList objectAtIndex:i] title]);

}

メソッドを呼び出した正しい日付から、アプリに使用しているカレンダーのすべてのイベントを取得します。

過去か何かであるため、与えることはうまくいかないと思い[NSDate distantPast]ます。startDateを設定する[NSDate date]とうまくいきます。

これが同じ問題を抱えている人々に役立つことを願っています。

于 2012-10-17T12:45:31.103 に答える
1

4年を超える1年のスパンを検索する場合、返されたイベントは、システムによって最初の4年のイベントにトリミングされます。(Appleのドキュメントを参照してください)。考えられる解決策は、述語マッチングをバッチで実行することです。

Xamarin.iOSのC#拡張機能は次のとおりです

public static class EKEventStoreExtensions
{        
    private const int MaxPredicateYearSpan = 4;

    public static EKEvent[] GetAllEvents(this EKEventStore eventStore, DateTimeOffset startAt, DateTimeOffset endAt, params EKCalendar[] calendars)
    {
        var isBatched = endAt.Year - startAt.Year >= MaxPredicateYearSpan;
        var result = new List<EKEvent>();
        var batchStartAt = startAt;
        var batchEndAt = endAt;

        while (batchStartAt < endAt)
        {
            if (isBatched)
            {
                batchEndAt = batchStartAt.AddYears(1);
                if (batchEndAt > endAt)
                {
                    batchEndAt = endAt;
                }
            }

            var events = GetEventsMatching(eventStore, batchStartAt, batchEndAt, calendars);
            result.AddRange(events);

            batchStartAt = batchEndAt;
        }

        return result.ToArray();
    }

    private static EKEvent[] GetEventsMatching(EKEventStore eventStore, DateTimeOffset startAt, DateTimeOffset endAt, EKCalendar[] calendars)
    {
        var startDate = (NSDate)startAt.LocalDateTime;
        var endDate = (NSDate)endAt.LocalDateTime;
        var fetchCalendarEvents = eventStore.PredicateForEvents(startDate, endDate, calendars);

        return eventStore.EventsMatching(fetchCalendarEvents);
    }
}
于 2018-09-27T19:56:25.747 に答える