【问题标题】:How to handle duplicate event using eventkit如何使用 eventkit 处理重复事件
【发布时间】:2014-03-13 06:08:59
【问题描述】:

我从网络服务收到一些事件。我使用 Eventkit 以编程方式添加这些事件。我有一个Add 按钮,它调用代码来添加接收到的事件。但是,重复添加操作会复制事件而不是合并(如果事件已经存在)。

如何避免重复事件?

【问题讨论】:

  • 当你点击添加事件按钮时,你需要检查事件是否已经存在,然后你需要插入它。您可以使用它们的唯一标识符检查事件。
  • thisthat 可能会有所帮助。
  • 显示您的代码以添加事件。

标签: ios iphone objective-c eventkit


【解决方案1】:

您必须在添加之前检查现有事件。下面的代码显示了如何做到这一点。我已经单独检查了标题和开始日期来识别事件,您可以根据需要使用更多参数。

EKEventStore *eventStore = [[EKEventStore alloc] init];
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:[startDate dateByAddingTimeInterval:-60]
                                                             endDate:[endDate dateByAddingTimeInterval:60] calendars:nil];
    NSArray *events = [eventStore eventsMatchingPredicate:predicate];
    bool found = NO;
    for ( EKEvent *evt in events )
    {
        if ( [evt.title isEqualToString:title]  && [evt.startDate isEqualToDate:startDate])
        {
            found = YES;                
            break;
        }
    }
if(!found)
{
//Add your event here.
}

【讨论】:

  • 它给出了这个错误 - 对日历守护程序的谓词调用失败:错误域 = EKCADErrorDomain Code=1013 “操作无法完成。(EKCADErrorDomain 错误 1013。)”
  • 该错误意味着您的应用程序没有访问日历的权限。您可以在您的应用的 iPhone 设置中启用它。
【解决方案2】:

即使我在向日历添加事件时也遇到了重复事件问题。所以在添加事件之前,我首先通过在谓词中传递开始和结束日期来删除它们,如下所示。

    func removeMobileCalendarEvents(){
    //lstEvents is response array which i got from web service and stored in model class
    for eventObj in lstEvents.list {

        let predicate = eventStore.predicateForEvents(withStart: eventStartDate, end: eventEndDate, calendars: nil)

        let events = eventStore.events(matching: predicate)

        for event in events {
            print("event title",event.title)
            print("event start date",event.startDate)
            print("event end date",event.endDate)
            //lstEvents is response array which i got from web service and stored in model class
            for eventObj in lstEvents.list {
                if event.title! == eventObj.EventName { 
                    //exists

                    do {
                        try eventStore.remove(event, span: .thisEvent, commit: true)
                    }
                    catch {
                        print("Error saving event in calendar")             }

                }else{
                    //not exists
                }
            }

        }
    }

    addingEventsToMobileCalendar()

}

一旦收到来自 Web 服务的响应,请调用 removeMobileCalendarEvents() 方法。调用 removeMobileCalendarEvents() 方法,多次调用 api。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多