向日歷中寫入事件(EventKit)

倚樓聽夢發表於2017-12-21
1、匯入 EventKit
2、建立EKEventStore物件

該物件建立和銷燬的時候和耗時間,而且在和Event相關的屬性釋放前釋放的時候,可能出現不可預知的BUG,所以在使用的時候,推薦使用單例

3、監測授權,請求授權
4、讀取事件資料
  • 建立謂詞 (謂詞的時間間隔,最大為4年)
  • 通過謂詞匹配時間(同步的)
5、增刪處理
6、簡單的程式碼
import Foundation
import EventKit

class CalendarEventManager {
    
    static let manager = CalendarEventManager()
    
    static var isAuthorized: Bool {
        return EKEventStore.authorizationStatus(for: .event) == .authorized
    }
    
    private let store = EKEventStore()
    
    func saveEvent(_ event: EKEvent) -> Bool {
        var rst = true
        do {
            try store.save(event, span: .thisEvent)
        } catch  {
            rst = false
        }
        return rst
    }
    
    func removeEvent(_ event: EKEvent) -> Bool {
        var rst = true
        do {
            try store.remove(event, span: .thisEvent)
        } catch {
            rst = false
        }
        return rst
    }
    
    func requestAnthorized(completion: @escaping (Bool, Error?) -> Void) {
        store.requestAccess(to: .event, completion: completion)
    }
    
    func loadEvents(withStart: Date, end: Date, completion: @escaping ([EKEvent]) -> Void) {
        let predicate = store.predicateForEvents(withStart: withStart, end: end, calendars: [store.defaultCalendarForNewEvents])
        DispatchQueue.global().async {
            let events = self.store.events(matching: predicate)
            DispatchQueue.main.async {
                completion(events)
            }
        }
    }
}
複製程式碼
7、內建UI展示,編輯ViewController
  • 匯入 EKEventUIKit
  • 建立,展示就行了
8、一些思考
  • 模擬器列印的EventStore中Calendars 發現有三個Calendar,預設使用的是Calendar。
  • 暫時沒有想到如何區分是本應用建立的時間
  • EKEvent這個類,可以繼承,但是沒法繼承構造方法,所有傳入不了EventStore。繼承是沒有效果的。

相關文章