2010-09-08 17 views
14

Sto tentando di eliminare un evento dal Calendario su richiesta dell'utente. Questo è ciò che mi è venuta in mente:Eliminazione di un evento dal calendario di 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]; 

Di seguito è la funzione sto chiamando per rimuovere l'evento dalla matrice evento. Articoli matrice viene utilizzata per recuperare gli eventi da iPhone calendario

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

Sei riuscito a risolvere questo? –

+1

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

+0

Ci sono due risposte doppie !!! – Maulik

risposta

16

In primo luogo, salvare l'eventId per l'evento, mentre l'aggiunta/salvataggio eventi al calendario.

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

e quindi identificare l'evento che si desidera rimuovere e quindi rimuovere quell'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]; 
} 

Inoltre, non dimenticare di rimuovere anche quell'evento da arrayofEventId.

+1

puoi dirmi cosa è 'arrayofEventId', dove tu l'hai dichiarato. – akk

+2

Sembra che sia solo un NSMutableArray vuoto, puoi dichiararlo tu stesso. con [array NSMutableArray]; –

+0

ho appena NSLog (% @ ", event.eventIdentifier) ​​e restituisce null puoi dirmi perché? –

1

È possibile raggiungere questo nei seguenti modi:

Creando un NSpredicate utilizzando il withing intervallo di date che si desidera eliminare gli eventi, 86400 essendo la durata di una giornata in eventi, in questo pezzo di codice sto cancellando eventi vecchi di un mese. Sto usando una coda di invio , come il n. di eventi recuperati può essere grande e mantenere l'interfaccia utente libera.

prima creare l'archivio eventi e controllare l'accesso (controllo di accesso richiesto solo iOS6 in poi):

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

Poi rimuovere gli eventi dal negozio:

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

Questa è la via Lunga, usalo per cancellare eventi in blocco. Ma se avete bisogno di cancellare un solo evento, quindi salvare l'identificatore eventi a `NSUserDefaults (dopo aver generato l'evento)

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

e poi prenderlo di nuovo durante la rimozione utilizzando

[eventStore eventWithIdentifier:@"Event ID"]; 

e quindi rimuoverlo dal negozio utilizzando

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

per ulteriori chiarimenti sugli altri metodi per recuperare gli eventi o calendario, pelase fare riferimento a EventStore docs:http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html#//apple_ref/doc/uid/TP40009567 o t he Calendar and Reminder Programming guide:http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/EventKitProgGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009765

Problemi correlati