1

CalEvent と EKEvent は両方とも、startDate、endDate、および発生日を表します。しかし、イベント オブジェクトは具体的なイベントを表すため、具体的な開始日と終了日があります。常にstartDateと同じであるoccurrenceDateを持つ理由は何ですか?

発生日がイベントの開始日と一致しない状況はありますか?

4

3 に答える 3

8

さて、私はちょうど実験をしました。これが、デタッチ前後の私の再発イベントです。

取り外す前に

po calendarItemExternalIdentifier
"68100758-1572-4662-87C8-84F32680D7C2"
po calendarItemIdentifier
"0D3D5906-9C0F-435A-A0BA-7A6B64086E86"
po self.occurrenceDate
2016-02-12 04:00:00 +0000
po startDate
2016-02-12 04:00:00 +0000
po self.isDetached
false

po calendarItemExternalIdentifier
"68100758-1572-4662-87C8-84F32680D7C2/RID=476942400"
po calendarItemIdentifier
"DAD9A39D-BD57-40D6-8615-B57E3AF9387C"
po self.occurrenceDate
2016-02-12 04:05:00 +0000
po startDate
2016-02-12 04:05:00 +0000
po self.isDetached
true

occurrenceDateそれが主張するものとは反対の変化がありました。興味深いのは (そして文書化されていない (?)) calendarItemExternalIdentifierRID を追加することで変更されたことです。RID は、2001 年 1 月 1 日の 00:00:00 UTC からoccurrenceDate.

于 2016-02-13T00:44:21.503 に答える
1

EKEventoccurrenceDateから。ドキュメント

イベントがデタッチされ、開始日が変更された場合でも、この値は同じままです。

したがって、定期的なイベントがあり、そのイベントの発生をそのイベントから切り離して、新しい別個のイベントを作成する場合、新しいイベントは同じoccurrenceDateですが異なるものになりstartDateます。

それは逆行しているように見えますが、それは私がドキュメントのその箇所から得ているものです。これは、Calendar / iCalで新しい定期的なイベントを作成し、その後発生するイベントをデタッチし、デタッチされたイベントとイベントキットを使用して実験することで確認できstartDateますoccurrenceDate

これがCalendarStoreでも同じように当てはまるのか、同じように当てはまるのかはわかりません。CalendarStoreのドキュメントoccurrenceには、プロパティとプロパティの違いが記載されていませんstartDate

于 2012-12-28T22:41:04.827 に答える
0

Kostia Kim からの回答に基づいて、元の発生日を取得するための拡張機能を次に示します。

extension EKEvent {

    var originalOccurrenceDate: Date? {
        guard self.isDetached, let interval = timeIntervalFromExternalIdentifier else { return nil }
        return Date(timeIntervalSinceReferenceDate: interval)
    }

    var timeIntervalFromExternalIdentifier: TimeInterval? {
        let intervalKey = "/RID="
        guard let externalId = calendarItemExternalIdentifier, externalId.contains(intervalKey) else { return nil }

        let identifierSegments = externalId.components(separatedBy: intervalKey)
        guard let lastSegment = identifierSegments.last, let ridInterval = TimeInterval(lastSegment) else { return nil }

        return ridInterval
    }

}
于 2017-10-14T19:20:48.787 に答える