我创建了一个包含某些活动的日历,现在我想从该日历中获取所有活动,而不知道他们的开始或结束日期是什么。
我尝试过的代码,从所有日历中获取所有事件,因此我可以稍后按日历ID将它们分开..:
NSPredicate *fetchCalendarEvents = [eventStore predicateForEventsWithStartDate:[NSDate distantPast] endDate:[NSDate distantFuture] calendars:eventStore.calendars];
NSArray *allEvents = [eventStore eventsMatchingPredicate:fetchCalendarEvents];
这会使allEvents
返回nil
,而数据库会清楚地显示日历中的事件。
有人可以帮助我吗?
答案 0 :(得分: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]
会有效。
希望这可以帮助那些有同样问题的人。
答案 1 :(得分:1)
如果您要查找跨度大于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);
}
}