如何在iOS设备上创建新的EKCalendar?

Sle*_*lee 14 iphone objective-c ipad ios

我有一个应用程序,我想安排一些事件.所以我想为我的应用创建一个新的日历,如果它尚不存在,并且在添加新事件时确实引用了它.

Den*_*cht 27

这是在使用EventKit框架的iOS 5上完成的:

首先,您需要一个EKEventStore对象来访问所有内容:

EKEventStore *store = [[EKEventStore alloc] init];
Run Code Online (Sandbox Code Playgroud)

现在,如果希望将日历存储在本地,则需要查找本地日历源.还有交换账户,CALDAV,MobileMe等来源:

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

现在,这是您可以获取以前创建的日历的部分.创建日历时(见下文)有一个ID.创建日历后必须存储此标识符,以便您的应用可以再次识别日历.在这个例子中,我只是将标识符存储在一个常量中:

NSString *identifier = @"E187D61E-D5B1-4A92-ADE0-6FC2B3AF424F";
Run Code Online (Sandbox Code Playgroud)

现在,如果您还没有标识符,则需要创建日历:

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);
}
Run Code Online (Sandbox Code Playgroud)

您还可以配置日历颜色等属性.重要的是存储标识符以供以后使用.另一方面,如果您已经拥有标识符,则只需获取日历:

else
{
    cal = [store calendarWithIdentifier:identifier];
}
Run Code Online (Sandbox Code Playgroud)

我也输入了一些调试输出:

NSLog(@"%@", cal);
Run Code Online (Sandbox Code Playgroud)

现在你要么有一个EKCalendar对象供进一步使用.

编辑:从iOS 6开始calendarWithEventStore折旧,使用:

cal = [EKCalendar calendarForEntityType:<#(EKEntityType)#> eventStore:<#(EKEventStore *)#>];
Run Code Online (Sandbox Code Playgroud)

  • @matt我看到的是,如果用户有iCloud,如果你创建了一个本地日历,它在iCal中是"不可见的".但如果他们没有iCloud,它就会出现预期.所以我首先检查iCloud,如果可用则使用它,否则创建本地. (5认同)