【问题标题】:How to get all events from an EKCalendar in iOS如何从 iOS 中的 EKCalendar 获取所有事件
【发布时间】:2012-10-16 09:25:30
【问题描述】:

我创建了一个包含一些事件的日历,现在我想从该日历中获取所有事件,而不知道它们的开始或结束日期是什么。

我试过的代码,从所有日历中获取所有事件,所以我可以稍后按日历 ID 划分它们..:

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

NSArray *allEvents = [eventStore eventsMatchingPredicate:fetchCalendarEvents];

这使得allEvents 返回nil,而数据库清楚地显示日历中的事件。

谁能帮帮我?

【问题讨论】:

    标签: ios xcode ios5 calendar ios6


    【解决方案1】:

    我现在可以工作了。

    这是我正在使用的代码:

    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] 会起作用。

    希望这对有同样问题的人有所帮助..

    【讨论】:

    • “[NSDate distinctPast] 不起作用,因为它是过去的什么”拯救了我的一天。谢谢!
    【解决方案2】:

    如果您要查找超过 4 年的年份,系统会将返回的事件修剪为前 4 年的事件。 (见Apple's documentation)。可能的解决方案是批量运行谓词匹配。

    这是 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      相关资源
      最近更新 更多