2016-04-27 75 views
0

我是编程新手我已经提出了一个提醒应用程序,它将事件保存在iCal中,现在我想通过项目中的代码删除该事件,我的代码用于创建iCal中的事件如下 -如何在iPhone日历上创建提醒和商店提醒

-(void) setReminderInPhone { 
NSString *dateWithTime = [NSString stringWithFormat:@"%@ %@",calenderDtl.dateInString,calenderDtl.openTimeUTC]; 
NSString *mrktName = mrktDtl.marketName; 
//dateWithTime = @"2016-04-02 04:10 am"; 

NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; 
fmt.dateFormat = @"yyyy-MM-dd hh:mm a"; 
[fmt setAMSymbol:@"am"]; 
[fmt setPMSymbol:@"pm"]; 
fmt.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; 
NSDate *utc = [fmt dateFromString:dateWithTime]; 

fmt.dateFormat = @"yyyy-MM-dd hh:mm a"; 
fmt.timeZone = [NSTimeZone systemTimeZone]; 
NSString *local = [fmt stringFromDate:utc]; 
NSDate *localDate = [fmt dateFromString:local]; 
EKEventStore *store = [EKEventStore new]; 
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
    if (!granted) { return; } 
    EKEvent *event = [EKEvent eventWithEventStore:store]; 
    event.title = mrktName; 
    event.startDate = localDate; //test 
    event.endDate = [event.startDate dateByAddingTimeInterval:60*2]; 
    event.calendar = [store defaultCalendarForNewEvents]; 
    NSError *err = nil; 
    [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 
}]; 
} 

回答

2

请尝试以下操作以从日历中删除事件。

EKEvent *eventToRemove = [eventStore eventWithIdentifier:eventIdentifier]; 

if (eventToRemove) 
{ 
    NSError* error = nil; 

    [eventStore removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error]; 
} 

你会得到eventIdentifier的价值在创建的iCalendar事件的时间如下:

//Adding Events to default iOS calendar for Making Reminders 
-(NSString *)addEventToCalendar: (NSString *)title withDate:(NSString *)date{ 

EKEvent *event = [EKEvent eventWithEventStore:eventStore]; 

event.title = [NSString stringWithFormat:@"Pregnancy Workout Advisor - Event: %@",title]; 

event.startDate = [dateFormatter dateFromString:date]; 

event.endDate = [event.startDate dateByAddingTimeInterval:60*60]; //set 1 hour meeting 

event.allDay = YES; 

[dateFormatter setDateFormat:@"YYYY-MM-dd"]; 

EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:[NSDate dateWithTimeInterval:9*60*60 sinceDate:[dateFormatter dateFromString:date]]]; 

[event addAlarm:alarm]; 

event.calendar = [eventStore defaultCalendarForNewEvents]; 

NSError *err = nil; 

[eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 

return event.eventIdentifier; } 

在这上面的方法,你会得到你正在添加的每个事件eventIdentifier到日历。将eventIdentifier存储到CoreData/Sqlite中,无论如何。

因此,当您需要删除该事件时,只需提供该eventIdentifier即可。这肯定会从日历中删除。

希望它可以帮助...

+0

可以请你解释我它是什么工作。 – Avantika

+0

首先,我们从eventStore获取事件条目。如果当天有事件发生,那么我们继续移除事件。 –

+0

我这样做,但无法删除EKEventStore * store = [EKEventStore new]; [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted,NSError error){if(!granted){return;} EKEvent eventToRemove = [store eventWithIdentifier:savedEventId]; if(eventToRemove){NSError * error = nil; [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error]; }}];没有错误,但它不允许简单地返回。 – Avantika

0

试试这个代码,它的工作对我来说,

EKEventStore *store = [[EKEventStore alloc] init]; 

      [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
       if (!granted) return; 
       EKEvent* eventToRemove = [store eventWithIdentifier:[eventIdendifier objectAtIndex:indexPath.row]]; 
       if (eventToRemove) { 
        [eventToRemove setCalendar:[store defaultCalendarForNewEvents]]; 

        NSError* err = nil; 

        [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&err]; 

        dispatch_async(dispatch_get_main_queue(), ^{ 

         [eventIdendifier removeObjectAtIndex:indexPath.row]; 

        }); 
       } 
      }]; 

我有给eventIdentifier价值,它的价值的NSMutableArray。首先,添加在事件存储,你必须每个事件得到了每个事件标识符值,它会自动保存到eventIdentifier并获得标识值的方法是下面的事件,

EKEventStore *store = [EKEventStore new]; 

    if ([store respondsToSelector:@selector(requestAccessToEntityType:completion:)]) 
    { 
     /* iOS Settings > Privacy > Calendars > MY APP > ENABLE | DISABLE */ 
     [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) 
     { 
      if (granted) 
      { 
       NSPredicate *predicate = [store predicateForEventsWithStartDate:date1 endDate:[date1 dateByAddingTimeInterval:23.96 * 60.0 * 60.0] calendars:nil]; 
       NSMutableArray *eventsVal = (NSMutableArray *)[store eventsMatchingPredicate:predicate]; 

       for (int i = 0; i<eventsVal.count; i++) { 
        [eventIdendifier addObject:[[eventsVal objectAtIndex:i] eventIdentifier]]; 
       } 

      } 
     }]; 

    } 

其谓语的开始日期,结束日期检查然后起身所有事件特定的日期,也从eventIdentifier增值对象,如果值帮助显示事件值,删除事件等

希望它有帮助

+0

使用它,但它是抛出错误使用未声明的标识符'eventIdendifier'如何删除此 – Avantika

+0

在您的建议之前,我正在尝试以下代码EKEventStore * store = [EKEventStore new]; [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted,NSError * error){ if(!授予){return;} EKEvent * eventToRemove = [store eventWithIdentifier:savedEventId];如果(eventToRemove){ NSError * error = nil; [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error]; } }];有没有错误,但它没有授予权限只是简单地返回 – Avantika

+0

对不起,eventIdentifier是NSMutableArray,当你添加事件你已经从eventStore获得事件标识符值,保存事件标识符值然后删除标识符值,它的最好的移除该事件。试试吧 –