2010-09-08 11 views
14

Estoy intentando eliminar un evento del Calendario a petición del usuario. Esto es lo que he llegado con:Eliminación de un evento del calendario de iPhone

// 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]; 

A continuación se muestra la función que estoy llamando para eliminar el caso de la matriz evento. Elementos de matriz se utiliza para recuperan eventos de calendario iPhone

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

¿Pudo solucionar esto? –

+1

http://stackoverflow.com/questions/3482920/removing-events-from-iphone-calendar-with-ekeventstore – iGo

+0

¡Hay dos respuestas duplicadas! – Maulik

Respuesta

16

En primer lugar, guardar el eventId para el evento mientras que la adición/almacenamiento de eventos en el calendario.

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

y luego identifique el evento que desea eliminar y elimine ese evento.

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]; 
} 

Además, no olvide quitar ese evento de arrayofEventId también.

+1

puede decirme qué es 'arrayofEventId', donde lo declaró. – akk

+2

Parece que es solo un NSMutableArray vacío, puede declararlo usted mismo. con [NSMutableArray array]; –

+0

simplemente NSLog (% @ ", event.eventIdentifier) ​​y me da nulo ¿me puede decir por qué? –

1

Esto se puede conseguir de las siguientes maneras:

Al crear una NSpredicate utilizando el PLAZO DE rango de fechas que quiere eliminar eventos, 86400 siendo la duración de un día en los acontecimientos, en esta pieza del código Estoy eliminando eventos de un mes. Estoy usando una cola de distribución , como el no. de eventos recuperados puede ser grande y mantener la UI libre.

En primer lugar crear el almacén de eventos y el registro de acceso (comprobación de acceso requerido solamente iOS 6 en adelante):

- (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]; 
     } 
    } 

A continuación, retire los acontecimientos de la tienda:

- (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 
      }); 
     }); 
    } 

Este es el camino largo, Úselo para eliminar eventos a granel. Pero si necesita eliminar un único evento, a continuación, guarde el identificador de eventos a `NSUserDefaults (después de generar el evento)

[eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:NULL]; 
[[NSUserDefaults standardUserDefaults] setObject:[event eventIdentifier] forKey:@"Event ID"]; 

y luego traerlo de vuelta mientras se quita usando

[eventStore eventWithIdentifier:@"Event ID"]; 

y luego lo elimina de la tienda utilizando

[eventStore removeEvent:event span:EKSpanThisEvent commit:YES error:NULL]; 

para más aclaraciones sobre los otros métodos en busca de eventos o calendario, pelase referirse a EventStore docs:http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html#//apple_ref/doc/uid/TP40009567 o a t él Calendar and Reminder Programming guide:http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/EventKitProgGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009765

Cuestiones relacionadas