从iPhone日历中删除事件

14

我正在尝试根据用户请求从日历中删除事件。这是我想出的代码:

// Deleting Event
    EKEventStore *eventStore = [[EKEventStore alloc] init];
EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
event.title     = appDelegate.title1;
event.startDate = appDelegate.recAddDate;
event.endDate   = appDelegate.currentDateName;
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err;
[eventStore removeEvent:event span:EKSpanThisEvent error:&err];

以下是我正在调用的函数,用于从事件数组中移除事件。Items数组用于从iPhone日历中获取事件

- (BOOL)removeEvent:(EKEvent *)event span:(EKSpan)span error:(NSError **)error{
    VoiceRecorderAppDelegate *appDelegate = (VoiceRecorderAppDelegate *)[[UIApplication sharedApplication] delegate];
    [items removeObjectAtIndex:appDelegate.objectindexpath];
}

1
http://stackoverflow.com/questions/3482920/removing-events-from-iphone-calendar-with-ekeventstore - Govind
有两个重复的答案!!! - Maulik
2个回答

16

首先,在将事件添加/保存到日历时保存事件的eventId。

[eventStore saveEvent:event span:EKSpanThisEvent error:&err]; 
NSString* str = [[NSString alloc] initWithFormat:@"%@", event.eventIdentifier];
[arrayofEventId addObject:str];

然后确定您想要删除的事件,然后删除该事件。

EKEventStore* store = [[EKEventStore alloc] init];
EKEvent* eventToRemove = [store eventWithIdentifier:[arrayofEventId objectAtIndex:i]];
 if (eventToRemove != nil) {  
   NSError* error = nil;
  [store removeEvent:eventToRemove span:EKSpanThisEvent error:&error];
 } 

还要不要忘记从arrayofEventId中删除该事件。


1
请问一下,'arrayofEventId'是什么意思?你在哪里声明了它? - Ravi Kumar Karunanithi
2
看起来这只是一个空的NSMutableArray,你可以用[NSMutableArray array]自己声明它。 - William T.
我只是打印了 NSLog(%@",event.eventIdentifier),但它返回了 null,你能告诉我为什么吗? - Zakaria Darwish

1
你可以通过以下方式实现:
使用包含要删除事件的日期范围的NSpredicate,86400是事件中一天的持续时间,在此代码片段中,我正在删除一个月前的事件。我正在使用调度队列,因为获取的事件数量可能很大,并且保持UI自由。
首先创建事件存储并检查访问权限(仅在iOS6及以上版本需要进行访问检查)。
    - (void)addEventsToCalendar {
        EKEventStore *eventStore = [[EKEventStore alloc] init];
        if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
            //implementation for devices running OS version iOS 6.0 onwards.
            [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
                if (granted) {
                    [self removeEventsFromStore:eventStore];
                } else {
                    //perform for No Access using Error
            }];
        } else {
            //implementation for devices running OS version lower than iOS 6.0.
            [self removeEventsFromStore:eventStore];
        }
    }

然后从存储中删除事件:
    - (void)removeEventsFromStore:(EKEventStore*)eventStore {
        NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:-30 * 86400];
        NSDate *endDate = [NSDate date];
        dispatch_queue_t queue = dispatch_queue_create("com.arc.calendar", NULL);

        dispatch_async(queue, ^{
            NSArray *calendarArray = [NSArray arrayWithObject:[PWCCalendar getCalendarForEventStore:eventStore]];
            NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:startDate endDate:[NSDate dateWithTimeInterval:ONE_DAY_DURATION sinceDate:endDate] calendars:calendarArray];
            NSArray *eventArray = [eventStore eventsMatchingPredicate:predicate];
            for (EKEvent *event in eventArray) {
                [eventStore removeEvent:event span:EKSpanThisEvent commit:YES error:NULL];
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                //Get the main Queue and perform UPdates
            });
        });
    }

这是一种冗长的方法,用于批量删除事件。但如果您只需要删除一个事件,则在生成事件后将事件标识符保存到`NSUserDefaults`中即可。
[eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:NULL];
[[NSUserDefaults standardUserDefaults] setObject:[event eventIdentifier] forKey:@"Event ID"];

然后通过

删除它并将其取回。
[eventStore eventWithIdentifier:@"Event ID"];

然后使用以下方法从存储中删除它:
[eventStore removeEvent:event span:EKSpanThisEvent commit:YES error:NULL];

如果您想了解其他获取事件或日历的方法,请参考 EventStore文档: http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html#//apple_ref/doc/uid/TP40009567 或者 日历和提醒编程指南: http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/EventKitProgGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009765


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接