iOSデバイスで新しいEKCalendarを作成するにはどうすればよいですか?

私はいくつかのイベントをスケジュールしたいアプリケーションを持っています。だから私はまだ存在しない場合、新しいイベントを追加するときにそれを参照する場合、私のアプリのための新しいカレンダーを作成したいと思います。

13

1 答え

これは、 EventKit フレームワークを使用してiOS 5上で実行される方法です。

まずすべてにアクセスするには、 EKEventStore オブジェクトが必要です。

EKEventStore *store = [[EKEventStore alloc] init];

カレンダーをローカルに保存する場合は、ローカルのカレンダーソースを見つける必要があります。交換アカウント、CALDAV、MobileMeなどのソースもあります。

// find local source
EKSource *localSource = nil;
for (EKSource *source in store.sources)
    if (source.sourceType == EKSourceTypeLocal)
    {
        localSource = source;
        break;
    }

ここで、以前に作成したカレンダーを取得できる部分があります。カレンダーが作成されると(下記参照)、IDがあります。この識別子は、アプリがカレンダーを再度識別できるようにカレンダーを作成した後に保存する必要があります。この例では、識別子を定数に格納したばかりです:

NSString *identifier = @"E187D61E-D5B1-4A92-ADE0-6FC2B3AF424F";

IDをまだ持っていない場合は、カレンダーを作成する必要があります:

EKCalendar *cal;
if (identifier == nil)
{
    cal = [EKCalendar calendarWithEventStore:store];
    cal.title = @"Demo calendar";
    cal.source = localSource;
    [store saveCalendar:cal commit:YES error:nil];
    NSLog(@"cal id = %@", cal.calendarIdentifier);
}

また、カレンダーの色などのプロパティを設定することもできます。重要な部分は、後で使用するために識別子を格納することです。 一方、すでに識別子がある場合は、カレンダーを取得するだけです:

else
{
    cal = [store calendarWithIdentifier:identifier];
}

私はデバッグ出力もいくつか入れました:

NSLog(@"%@", cal);

今度は、後で使用するために EKCalendar オブジェクトをどちらかの方法で持っています。

EDIT: As of iOS 6 calendarWithEventStore is depreciated, use:

cal = [EKCalendar calendarForEntityType:<#(EKEntityType)#> eventStore:<#(EKEventStore *)#>];
26
追加された
新しいカレンダーを作成しようとすると、私のカレンダーが時には表示され、その後iPadのカレンダーアプリケーションから消えてしまうようです。私は新しいカレンダーを作成してカレンダーアプリにも追加したいと考えていました。私はこれらのイベントを照会できるようにする必要があり、カレンダーの分離はそれを行う最良の方法であるようです。
追加された 著者 Slee,
イベントを削除しているiCloudがオンになっているように見えますが、私はそれについて何をしていますか?
追加された 著者 Slee,
@matt私が見たのは、ユーザーがiCloudを持っている場合、ローカルカレンダーを作成すると、iCalでは「見えない」ということでした。しかし、iCloudをお持ちでない場合は、期待どおりに表示されます。だから、まずiCloudをチェックし、それが利用可能であればそれを使用します。それ以外の場合はローカルに作成します。
追加された 著者 Corey Floyd,
@DennisBliefernichtのEKSourceTypeLocalでカレンダーがカレンダーアプリに表示されず、EKSourceTypeSubscribedに変更されて固定されました。
追加された 著者 xarly,
ニースコード、井戸構造とよく説明されています。しかし、O.P.に警告する必要があるというキャッチがあります。私のアプリがローカルカレンダーを作成した場合、ユーザーは後でカレンダーアプリでそれを削除できないということです。それはバグのようです。たぶん私は何かが欠けているかもしれませんが、私はスローするのを忘れている "userCanEdit"タイプのスイッチは表示されません...
追加された 著者 matt,
@ sairam私が今見ているのは、デバイス上で、iOS 6を実行しているときに、カレンダーでローカルカレンダーとイベントを作成するために使用していたコードが、エラーを報告することなくカレンダーを作成しません。これは、私のデバイスでiCloudをオフにしているにもかかわらずです。
追加された 著者 matt,
Appleの開発者フォーラムで、理由を見つけたOoops氏:iCloud をオフにし、gmailのカレンダー同期を無効にする必要がありました。私がそれを行うまで、ローカルカレンダーの作成は エラーなし に失敗しました。
追加された 著者 matt,
良い会話。私はしようとしましたが、ipadで完璧に動作します。私のiPodのカスタムカレンダーは作成されていません。両方のデバイスにgoogleが有効になっています。誰も助けることができますか?
追加された 著者 Siten,
良い質問。 iCloudは別のEKEventSourceを使用していますが、私はCalDAV型だと思っていますが、iCloudのタイトルを使っています。おそらく、このソースが利用可能で、カレンダーを作成しようとしているかどうかを確認してください。
追加された 著者 Dennis Bliefernicht,
cal.sourceは、カレンダーがプルされるデータソースを示します。これはローカルカレンダー(iPhone/iPad上)、CALDAVアカウント、交換サーバーなどです。このコードでは、ネットワークソースを作成する代わりにローカルソースを使用してデバイスローカルカレンダーを作成します。
追加された 著者 Dennis Bliefernicht,
cal.sourceについて言及する必要があるのは何ですか?
追加された 著者 sairam,