iOS Reminder関係の処理についてスニペットをいくつか見かけるけど、基本的なことが書いてなかったので、Error処理 Swift2.0から変更に成った部分も合わせてまとめてみる。
*いつも読んでるだけだったのでたまにはと思い初投稿。
サンプルソースコード
/* Step1: EKEventStoreインスタンスの作成 */
var eventStore = EKEventStore()
/* Step2: EKReminderインスタンスの作成と必要な情報のセット */
var NewReminder: EKReminder = EKReminder(eventStore: eventStore)
NewReminder.title = "新しいReminder"
NewReminder.calendar = eventStore.defaultCalendarForNewReminders()
/* Step3: Step2で作ったリマインダーインスタンスを保存する */
do {
try eventStore.saveReminder(NewReminder, commit: true)
} catch let error{
print(error)
}
それぞれの解説
Step1: EKEventStoreインスタンスの作成
EKEventStoreは本体内に存在するカレンダーやReminderの情報をRead & Writeできるクラス。カレンダー・Reminderで似ている関数も多いがデータ構造の違いもあり全て同じではない。なお処理が重いらしいのであまりたくさんインスタンス作らない方が良いらしい。
STEP2: EKReminderインスタンスの作成と必要な情報のセット
EKReminderはリマインダーのためのオブジェクト。タイトルやプライオリティ・期限などをセットできる。eventStoreから取得して項目を編集しても良いが、今回は新規リマインダー作成のため新しくインスタンスから作成。EKReminder.calendarは、どのリストに登録するのかを指定する項目。defaultCalendarForNewReminders()はその端末内でデフォルト設定してあるリストを自動的に参照指定している
なおiOSの[設定->リマインダー->デフォルトのリスト]で設定ができる
Step3: Step2で作ったリマインダーインスタンスを保存する
SWIFT2.0からdo catchが使えるので、それに合わせて。Objective-Cとはerrorの引数がないなど多少違うので過去記事見ていると若干迷うかも?
参考
EKEventStore Class Reference
Swift2.0で追加された try, do-catch, defer を試してみる
その他メモ
1) 既存のReminderの編集方法は?
基本的にsaveReminderで保存の仕方は同じ。
EKReminder.calendarItemIdentifier
EKReminder.calendarItemExternalIdentifier
この辺をキー(*1)としてその他の項目を編集して、上記と同じようにEKEventStore.saveReminderに投げるだけで良い。
*1: これらのIDについては端末によって異なるっぽいが未検証
2) パーミッション問題
そもそもMKEventStoreへアクセスする際にパーミッション周りで引っかかる人も多いようなので、その辺については下記を参照。
iOSでカレンダーにアクセスしてイベントを取得する
3) 詳細なサンプル
そもそもReminder Managerみたいなクラス作って完成したと喜んでたら、そもそもちゃんと作り込んでいる人がいた。なんかほとんど似てる。。
EventKit reminders manager : How to retrieve, create, and edit reminders from within your app in Swift