Не сохраняются изменения в EKEvent с recurrenceRules

Следующий код работает для неповторяющихся событий, изменения startDate и endDate сохраняются просто отлично.

BOOL success = [theEventStore saveEvent:event
                                   span:EKSpanFutureEvents
                                 commit:YES error:&error];

Но всякий раз, когда я пытаюсь отредактировать событие, которое имеет recurranceRules, оно возвращается с успехом == YES, но ничего не сохраняется, и любые изменения в startDate/endDate или recurranceRules возвращаются к исходным значениям. (Использование span:EKSpanThisEvent работает, но это, конечно, не то, что я хочу сделать. Кроме того, код работает на iOS, но не на OSX.)


person Felix Ungman    schedule 08.05.2013    source источник


Ответы (2)


eventWithIdentifier возвращает первое появление повторяющегося события. Когда вы измените что-то в этом событии с помощью EKSpanFutureEvents, вы измените все вхождения. eventsMatchingPredicate возвращает каждое вхождение события, соответствующее вашему предикату. EKSpanFutureEvents изменит каждое вхождение с определенного вхождения, которое вы использовали. Если событие отсоединено, не имеет значения, берете ли вы EKSpanThisEvent или EKSpanFutureEvents. Я не понимаю, что должен делать ваш код.

person Thomas M    schedule 24.05.2013
comment
Согласно проведенным мной тестам, на iOS все работает так, как вы говорите. Но на Mac использование eventsMatchingPredicate не работает, оно не сохраняет изменения. Обходной путь, который я использую, — выбрать исходное вхождение с помощью eventWithIdentifier. Но все это немного озадачивает, так что любые подсказки о том, что происходит, приветствуются. - person Felix Ungman; 26.05.2013
comment
У меня нет опыта работы с Mac, извините. - person Thomas M; 27.05.2013

Я думаю, что нашел решение или, по крайней мере, обходной путь. Кажется, что в Mac OS X, когда вы изменяете повторяющиеся события, вы должны получать их с помощью eventWithIdentifier, а не использовать события из eventsMatchingPredicate.

NSArray* events = [_eventStore eventsMatchingPredicate:predicate];
EKEvent* event = [events objectAtIndex:index];
EKEvent* original = [_eventStore eventWithIdentifier:event.eventIdentifier];
if (event.isDetached)
{
    … // modify detached event
    success = [_eventStore saveEvent:event
        span:EKSpanThisEvent
        commit:YES
        error:&error];
}
else if (!original.hasRecurrenceRules)
{
    … // modify non-recurrent event
    success = [_eventStore saveEvent:event
        span:EKSpanFutureEvents
        commit:YES
        error:&error];
}
else
{
    … // modify the original in a series of recurring events
    success = [_eventStore saveEvent:original
        span:EKSpanFutureEvents
        commit:YES
        error:&error];
}

Я не нашел никакой хорошей документации по этому поводу, возможно, это «ошибка» или просто одно из специфических поведений EventKit. В любом случае кажется, что вам нужно проявлять большую осторожность при изменении повторяющихся событий.

person Felix Ungman    schedule 10.05.2013