SwiftでiOSカレンダーを使う
swift calendar
とかで検索すると独自UIを作る情報は検索されるけど、あんまりEventKitを使った情報が出てこなかった。
リファレンス上のデモもswiftのバージョンがないし。
Google Calendarの時も思ったけど、あんま情報ないんだよね。ライブラリー(?)の更新とかもあんまないし。カレンダーって人気ないのかな?w
バージョン
環境 | バージョン |
---|---|
Xcode | 7.3, 7.2 |
Swift | 2.2, 2.1 |
iOS | 9.3, 9.2 |
参照したドキュメント
EventKitのリファレンス
使い方
準備
EventStore経由であれこれするので、初期化
// EventStoreを初期化 let eventStore = EKEventStore()
カレンダーへのアクセス許可の取得
// 許可状況を確認して、許可されていなかったら許可を得る func allowAuthorization() { if getAuthorization_status() { // 許可されている return } else { // 許可されていない eventStore.requestAccessToEntityType(.Event, completion: { (granted, error) in if granted { return } else { print("Not allowed") } }) } } // 認証ステータスを確認する func getAuthorization_status() -> Bool { // 認証ステータスを取得 let status = EKEventStore.authorizationStatusForEntityType(.Event) // ステータスを表示 許可されている場合のみtrueを返す switch status { case .NotDetermined: print("NotDetermined") return false case .Denied: print("Denied") return false case .Authorized: print("Authorized") return true case .Restricted: print("Restricted") return false } }
カレンダーの一覧の取得
let calendars = eventStore.calendarsForEntityType(.Event)
イベントの一覧を取得
func listEvents() { // 検索条件を準備 let startDate = NSDate() let endDate = NSDate() let defaultCalendar = eventStore.defaultCalendarForNewEvents // ここではデフォルトのカレンダーを指定 // 検索するためのクエリー的なものを用意 let predicate = eventStore.predicateForEventsWithStartDate(startDate, endDate: endDate, calendars: [defaultCalendar]) // イベントを検索 let events = eventStore.eventsMatchingPredicate(predicate) }
イベントの新規登録
func addEvent() { // イベントの情報を準備 let startDate = NSDate() let cal = NSCalendar(identifier: NSCalendarIdentifierGregorian)! let endDate = cal.dateByAddingUnit(.Hour, value: 2, toDate: startDate, options: NSCalendarOptions())! let title = "カレンダーテストイベント" let defaultCalendar = eventStore.defaultCalendarForNewEvents // イベントを作成して情報をセット let event = EKEvent(eventStore: eventStore) event.title = title event.startDate = startDate event.endDate = endDate event.calendar = defaultCalendar // イベントの登録 do { try eventStore.saveEvent(event, span: .ThisEvent) } catch let error { print(error) } }
イベントの削除
func deleteEvent(event: EKEvent) { do { try eventStore.removeEvent(event, span: .ThisEvent) } catch let error { print(error) } }