Как получить конкретный повторяющийся EKEvent в будущем?

Я записал повторяющиеся события (EKEvent) в Календарь. Как я могу получить и изменить одно из этих повторяющихся событий в определенную дату?

События были созданы следующим кодом:

+ (void) writeTestEvent{

    EKEventStore *eventStore = [[EKEventStore alloc] init];
    EKEvent *event = [EKEvent eventWithEventStore:eventStore];

    event.calendar = [eventStore defaultCalendarForNewEvents];
    event.title = @"Hello World!";
    event.startDate = [NSDate date];
    event.endDate = [NSDate date];

    EKRecurrenceRule *recurrenceRule = [[EKRecurrenceRule alloc] initRecurrenceWithFrequency:EKRecurrenceFrequencyDaily interval:1 end:nil];
    [event addRecurrenceRule:recurrenceRule];

    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (granted) {
            BOOL isSaved = [eventStore saveEvent:event span:EKSpanFutureEvents commit:YES error:&error];
            NSLog(@"isSaved: (%d) with error: %@", isSaved, error);
        } else {
            NSLog(@"not granted with error: %@", error);
        }
    }];
}

Использование -predicateForEventsWithStartDate:endDate:calendars: позволяет получить только события, попадающие в диапазон дат, а не конкретное событие. А с помощью идентификатора события получает только одно событие, но не с конкретной датой.


person Xaree Lee    schedule 04.10.2013    source источник


Ответы (1)


Согласно документации:

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

Образец, чтобы получить конкретное повторение EKEvent:

EKEventStore *eventStore = [[EKEventStore alloc] init];

NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:calendars];

NSArray *results =  [eventStore eventsMatchingPredicate:predicate];
for (int i = 0; i < results.count; i++) {
     EKEvent *event = [results objectAtIndex:i]
     if ([event. eventIdentifier isEqualToString: eventIdentifier]) {
        // Match!!
    break;
    }
}
person Laszlo    schedule 17.02.2014
comment
Это очень жаль. Спасибо за разъяснение, хотя! - person Sam Soffes; 28.08.2016
comment
Это должен быть EKEventStore, а не EventStore в первой строке. - person Victor Engel; 24.10.2017