Как получить следующую дату появления EKEvent? - PullRequest
0 голосов
/ 13 мая 2018

Я создаю EKEvent в календаре с шаблоном повторения.

EKRecurrenceRule <0x6000000b0980> RRULE FREQ = НЕДЕЛЬНЫЙ; ИНТЕРВАЛ = 2; BYDAY = СУ, МО; WKST = СУ

Событие создается в воскресенье 13 мая 2018 года и должно проводиться каждые 2 недели в воскресенье и понедельник.

Согласно правилу повторения, следующие даты вхождения - 14 мая 2018 года, 27 мая 2018 года, 28 мая 2018 года и т. Д.

Я ищу способ получить следующую дату вхождения, основываясь на правиле повторения, которое в данном случае будет 14 мая 2018 года.

Я могу получить текущую дату вхождения, набрав event.occurrenceDate;

Однако я не смог найти способ получить следующую дату вхождения.

EKEventStore *eventStore = [[EKEventStore alloc] init];
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.startDate = self.startTime;
event.endDate = [event.startDate dateByAddingMinutes:self.durationMins];
event.recurrenceRules = [NSArray arrayWithObject:[[EKRecurrenceRule alloc] initWithString:@"FREQ=WEEKLY;INTERVAL=2;BYDAY=SU,MO;"]];
NSDate *currentOccurence = event.occurrenceDate;
NSDate *nextOccurence = ?? ;

Я пытался сделать это:

Получить все события за месяц и сравнить каждое событие с текущим происходящим событием. Если они совпадают, получите дату следующего события.

 NSPredicate * predicate = [self.eventStore predicateForEventsWithStartDate:event.startDate endDate:[event.startDate dateByAddingMonths:1] calendars:@[[self.eventStore calendarWithIdentifier:self.selectedCalendarIdentifier]]];
                NSArray * events = [self.eventStore eventsMatchingPredicate:predicate];
                for (EKEvent * temp in events) {
                    //get the next event by comparing this event occurrence with current event occurrence date

                }

и я вижу, что массив событий не имеет правильных дат возникновения. В нем отсутствуют некоторые даты появления.

Я также могу воспроизвести это в приложении родного календаря. Я создал тестовое событие с тем же шаблоном повторения, которое происходит каждые 2 недели на солнце, понедельник.

Однако он отображается только в понедельник каждую неделю.

enter image description here

enter image description here

enter image description here

Как видно из ежемесячного календаря, событие должно появиться только 13 мая, 14 мая, а следующее вхождение 27 мая, 28 мая, а следующее вхождение 10 июня, 11 июня, исходя из схемы повторения, но это выступление 13 мая (верно), 21 мая (неправильно), 27 мая (правильно), 4 июня (неправильно).

...