避免 iOS EventKit startDate 和 endDate 与现有事件重叠

Avoid iOS EventKit startDate and endDate overlapping with existing events

我可以使用这个简单的代码片段成功地将一些事件添加到日历中:

 var eventStore : EKEventStore = EKEventStore()
        eventStore.requestAccessToEntityType(EKEntityTypeEvent, completion: {
            granted, error in
            if (granted) && (error == nil) {
                println("Access granted to calendar \(granted)")
                println("No error or error is simply \(error)")
                
                var event:EKEvent = EKEvent(eventStore: eventStore)
                event.title = fullTitle
                event.startDate = startDate
                event.endDate = endDate
                event.notes = "This is a note"
                event.calendar = eventStore.defaultCalendarForNewEvents
                eventStore.saveEvent(event, span: EKSpanThisEvent, error: nil)
                println("Saved Event")
            }

我可以处理错误和授权问题,但我想确保没有重叠,即使是在添加新日历事件和现有日历事件时一分钟也不重叠。

默认情况下,它只是“过载”,我可以同时设置许多事件,但我不想要这种行为...所以,我的意思是 startDate 和 endDate 应该设置为空插槽,如果中间已经设置了一些东西,我想提前得到通知。

我阅读了 EventKit 文档,但对我来说有点麻烦,而且我发现的示例与我得到的代码大不相同,但工作正常。

您可以在保存前搜索事件是否存在。如果事件存在,则不添加它。

要查找事件是否存在,您可以使用类似的东西:

NSString *predicateString= [NSString stringWithFormat:@"title == '%@' AND location == '%@' AND notes == '%@'", event.title, event.location, event.notes ];
    
    NSPredicate *matches = [NSPredicate predicateWithFormat:predicateString];
    
    NSArray *datedEvents = [self.eventStore eventsMatchingPredicate:[eventStore predicateForEventsWithStartDate:event.startDate endDate:event.endDate calendars:nil]]; //search in all calendars
    
    NSArray *matchingEvents = [datedEvents filteredArrayUsingPredicate:matches];