ObjecTips

Swift & Objective-C で iOS とか macOS とか

デフォルトの EKCalendar について

デフォルトの EKSource

iOS にはデフォルトで2つのデフォルトのソース EKSource が用意されている。
1つはローカルのカレンダー(iCloud同期を設定しない場合)。
もう1つは EventKit からはアクセスできない誕生日用のカレンダー。

このあたりの詳しい話は以下に書いてある。

デフォルトの EKCalendar

カレンダーは EKEventStorecalendarsForEntityType: もしくは EKSourcecalendarsForEntityType: メソッドで取得できる。
前者は返り値の型が NSSet で後者は NSArray になっているので若干注意が必要。

iPhone が初期状態だとリマインダー用のカレンダーは存在していない。
一度リマインダーアプリを起動するか、以下のように defaultCalendarForNewReminders メソッドで新規リマインダー作成用のカレンダーを取得するとリマインダー用のカレンダーが作成される。

システム作成のカレンダーと自前のカレンダーの違い

システムによって作成されているイベントのカレンダーと、システムによって作成されるリマインダーのカレンダーは少し特殊で

/*!
    @property   title
    @abstract   The title of the calendar.
*/
@property(nonatomic, copy)     NSString          *title;

title プロパティは言語によってローカライズされた値を持っている。
* ただし Birthday はローカライズされておらず Calendar と Reminders のみ。

英語 日本語
Calendar カレンダー
Reminders リマインダー
Birthday Birthday

この title をコードから設定して上書きした時や自分で EKCalendar を作成する時はこのようなローカライズは行えず設定した値がどの言語でも表示される。

トリビア

システムが作成したカレンダーの description

EKCalendar <0x175271b0> {title = Birthdays; type = Birthday; allowsModify = NO; color = #8295AF;}

自前で作ったカレンダーの description

EKCalendar <0x17569c60> {title = test; type = Local; allowsModify = YES; color = #ff0000;}

color のところが大文字か小文字かの違いが出る。
システム作成のカレンダーにコードで色を設定するとシステム作成のカレンダーも color は小文字表示になる。
システムがカレンダーを作成する時はテキストからカラー文字列とカラーの値を設定して、コードでカラーを設定する時はカラーからカラー文字列を生成している。中ではそんな実装になっているような気がする。