我正在编写一个 iPhone 应用程序,它将使用 EventKit 框架在用户的日历中创建新事件。这部分工作得很好(除了它处理时区的奇怪方式——但这是另一个问题)。我想不通的是如何获取用户日历的列表,以便他们可以选择将事件添加到哪个日历。我知道它是一个 EKCalendar 对象,但文档没有显示任何获取整个集合的方法。
提前致谢,
标记
搜索文档会发现一个EKEventStore
具有calendars
属性的类。
我的猜测是你会做这样的事情:
EKEventStore * eventStore = [[EKEventStore alloc] init];
NSArray * calendars = [eventStore calendars];
编辑:从 iOS 6 开始,您需要指定是否要检索提醒日历或事件日历:
EKEventStore * eventStore = [[EKEventStore alloc] init];
EKEntityType type = // EKEntityTypeReminder or EKEntityTypeEvent
NSArray * calendars = [eventStore calendarsForEntityType:type];
我用来获取日历名称和类型的可用 NSDictionary 的代码是这样的:
//*** Returns a dictionary containing device's calendars by type (only writable calendars)
- (NSDictionary *)listCalendars {
EKEventStore *eventDB = [[EKEventStore alloc] init];
NSArray * calendars = [eventDB calendars];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString * typeString = @"";
for (EKCalendar *thisCalendar in calendars) {
EKCalendarType type = thisCalendar.type;
if (type == EKCalendarTypeLocal) {
typeString = @"local";
}
if (type == EKCalendarTypeCalDAV) {
typeString = @"calDAV";
}
if (type == EKCalendarTypeExchange) {
typeString = @"exchange";
}
if (type == EKCalendarTypeSubscription) {
typeString = @"subscription";
}
if (type == EKCalendarTypeBirthday) {
typeString = @"birthday";
}
if (thisCalendar.allowsContentModifications) {
NSLog(@"The title is:%@", thisCalendar.title);
[dict setObject: typeString forKey: thisCalendar.title];
}
}
return dict;
}
我得到日历列表 OK - 问题是我没有得到用户可显示的列表。其中的 calendar.title 属性为 null;我也没有看到任何类型的 id 属性。
-> 更新:它现在对我有用。我犯的错误是将 eventStore 对象放在一个临时变量中,然后获取日历列表,然后释放 eventStore。好吧,如果你这样做,你所有的日历也会消失。在某些 iOS 框架中,包含并非严格面向对象,这就是一个例子。也就是说,日历对象依赖于事件存储,它不是它自己的独立实体。
无论如何-上面的解决方案很好!