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!
Guter Fang. Ich dachte, dass ich genaue Übereinstimmungen für die Start- und Endzeiten hätte. Vielen Dank! – Alex