不会保存对具有recurrenceRules的EKEvent的更改

时间:2013-05-08 13:40:39

标签: osx-mountain-lion eventkit

以下代码适用于非重复事件,对startDate和endDate的更改保存得很好。

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

但每当我尝试编辑具有recurranceRules的事件时,它会返回成功== YES,但不保存任何内容,并且对startDate / endDate或recurranceRules的任何更改都将恢复为原始值。 (使用span:EKSpanThisEvent可以工作,但这当然不是我想要的。此外,代码适用于iOS,但不适用于OSX。)

2 个答案:

答案 0 :(得分:1)

eventWithIdentifier返回第一次出现的重复事件。当您使用EKSpanFutureEvents更改此事件的内容时,您将更改所有实例。 eventsMatchingPredicate返回与谓词匹配的每个事件。 EKSpanFutureEvents将根据您使用的特定事件更改每个事件。 如果事件被分离,则无关紧要,如果您使用EKSpanThisEvent或EKSpanFutureEvents。 我不知道你的代码应该做什么。

答案 1 :(得分:0)

我想我找到了解决方案,或者至少是一种解决方法。似乎在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];
}

我没有找到任何关于此的好文档,可能是“bug”或只是EventKit的那些特殊行为之一。无论如何,在修改重复发生的事件时,您似乎需要非常小心。