2013-05-08 46 views
0

以下代碼適用於非重複性事件,對startDate和endDate的更改已保存得很好。不會將更改保存到具有重複發生的EKEvent規則

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

但每當我試圖編輯具有recurranceRules一個事件,它成功返回== YES,但沒有被保存,和的startDate /結束日期的任何改變或recurranceRules都恢復到原來的值。 (使用跨度:EKSpanThisEvent的作品,但這當然不是我想要做的。此外,代碼適用於iOS,但不適用於OSX。)

回答

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]; 
} 

我還沒有找到任何這良好的文檔,也許這是一個「錯誤」或只是EventKit的那些奇特的行爲之一。無論如何,在修改週期性事件時似乎需要格外小心。

1

eventWithIdentifier返回第一次出現的重複事件。當您使用EKSpanFutureEvents更改此事件時,您將更改所有的事件。 eventsMatchingPredicate返回每個匹配謂詞的事件發生。 EKSpanFutureEvents將從您使用的某個事件中更改每個事件。 如果事件被分離,則無關緊要,如果使用EKSpanThisEvent或EKSpanFutureEvents。 我不明白你的代碼應該做什麼。

+0

根據我所做的測試,它可以像你在iOS上說的那樣工作。但在Mac上,使用eventsMatchingPredicate不起作用,它不保存更改。我使用的解決方法是使用eventWithIdentifier來獲取原始事件。但是這有點令人費解,所以所有關於發生的事情的線索都是受歡迎的。 – 2013-05-26 14:07:38

+0

我在Mac上沒有任何經驗,對不起。 – 2013-05-27 08:30:00

相關問題