2016-02-01 6 views
5

Ich habe Probleme zu überprüfen, ob bereits ein Ereignis im Kalender des Benutzers vorhanden ist. Ich muss dies überprüfen, um festzustellen, ob ich es hinzufügen soll oder nicht, damit ich keine doppelten Kalendereinträge erstelle. Im Moment erstelle ich jedes Mal einen doppelten Eintrag, wenn ich den Code ausführe.Überprüfen Sie, ob das Ereignis im Kalender vorhanden ist

Als erstes ist hier, wie ich den Kalendereintrag erschaffe:

+ (NSString *) addEventToCalenderWithDate : (NSDate *) eventDate 
           eventTitle : (NSString *) eventTitle 
          eventLocation : (NSString *) eventLocation 
           allDayEvent : (BOOL) isAllDay 
{ 
    EKEventStore *store = [[EKEventStore alloc] init]; 

[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 

    if (!granted) { 

     returnValue = @"calendar error"; 

    } 

    else if ([self eventExists:dateAndTime eventTitle:eventTitle allDayEvent:isAllDay]) { 

     returnValue = @"duplicate"; 

    } 

    else { 

     EKEvent *event = [EKEvent eventWithEventStore:store]; 
     event.title = eventTitle; 

     event.startDate = dateAndTime; 

     if (eventTimeString == (id)[NSNull null] || eventTimeString.length == 0 || isAllDay) { 
      event.allDay = YES; 
      event.endDate = dateAndTime; 
     } else { 
      event.endDate = [event.startDate dateByAddingTimeInterval:60*60]; //set 1 hour meeting 
     } 

     event.location = eventLocation; 
     [event setCalendar:[store defaultCalendarForNewEvents]]; 
     NSError *err = nil; 
     [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 

     returnValue = @"success"; 
    } 
}]; 

return returnValue; 


} 

Dies stellt die korrekte Ereignis. Wenn ich es jedoch erneut ausführe, erwarte ich, dass die else if-Klausel YES zurückgibt und kein neuer Eintrag erstellt wird. Es gibt jedoch immer NO zurück und ich erstelle mit jeder Ausführung einen neuen Kalendereintrag. Hier ist das Verfahren:

+ (BOOL) eventExists : (NSDate *) date 
      eventTitle : (NSString *) eventTitle 
     allDayEvent : (BOOL) isAllDay 
{ 
    EKEventStore *store = [[EKEventStore alloc] init]; 

    NSPredicate *predicateForEventOnDate = [[NSPredicate alloc] init]; 

    if (isAllDay) 
     predicateForEventOnDate = [store predicateForEventsWithStartDate:date endDate:date calendars:nil]; // nil will search through all calendars 
    else 
     predicateForEventOnDate = [store predicateForEventsWithStartDate:date endDate:[date dateByAddingTimeInterval:60*60] calendars:nil]; // nil will search through all calendars 

    NSArray *eventOnDate = [store eventsMatchingPredicate:predicateForEventOnDate]; 
    NSLog(@"eventOnDate: %@", eventOnDate); 

    BOOL eventExists = NO; 

    for (EKEvent *eventToCheck in eventOnDate) { 
     if ([eventToCheck.title isEqualToString:eventTitle]) { 
      eventExists = YES; 
     } 
    } 

    return eventExists; 
} 

Wie ich durch diese Methode Schritt, merke ich, dass die NSArray genannt eventOnDate ist nil (die EKEventStore ist nicht nil). Ich weiß nicht, ob das bedeutet, dass es einfach keine passenden Ereignisse gefunden hat oder etwas anderes passiert.

Was mache ich falsch, dass dies keine vorhandenen Ereignisse im Kalender identifizieren kann? Vielen Dank!

Antwort

5

Das Problem scheint mit dem Datumsbereich zu sein, den Sie für Ihr Prädikat ausgewählt haben.

predicateForEventOnDate = [store predicateForEventsWithStartDate:date endDate:date calendars:nil]; 

innerhalb eines „0“ zweiten Bereichs für Veranstaltungen suchen, weil das Start- und Enddatum Ihrer Prädikat Abfrage identisch Dies wird.

predicateForEventOnDate = [store predicateForEventsWithStartDate:date endDate:[date dateByAddingTimeInterval:60*60] calendars:nil]; 

Dies wird nur nach Ereignissen suchen, die innerhalb einer Stunde nach dem angegebenen Datum liegen.

Dies erzeugt ein Array, das Ereignisse für den ganzen Tag von Anfang bis Ende abdeckt.

+0

Guter Fang. Ich dachte, dass ich genaue Übereinstimmungen für die Start- und Endzeiten hätte. Vielen Dank! – Alex