我的应用程序如何获取用户 iPhone 上的日历列表

Posted

技术标签:

【中文标题】我的应用程序如何获取用户 iPhone 上的日历列表【英文标题】:How can my app get a list of calendars on user's iPhone 【发布时间】:2011-01-08 19:10:43 【问题描述】:

我正在编写一个 iPhone 应用程序,它将使用 EventKit 框架在用户的日历中创建新事件。这部分工作得很好(除了它处理时区的奇怪方式——但这是另一个问题)。我想不通的是如何获取用户日历的列表,以便他们可以选择将事件添加到哪个日历。我知道它是一个 EKCalendar 对象,但文档没有显示任何获取整个集合的方法。

提前致谢,

标记

【问题讨论】:

【参考方案1】:

在文档中搜索会发现一个具有calendars 属性的EKEventStore 类。

我的猜测是你会做这样的事情:

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];    

【讨论】:

太棒了!谢谢!初步实验证实它返回了一组日历。 由于属性 'calendars' 在 iOS 6.0 中已弃用,您应该更改为 NSArray *calendars = [eventStore calendarsForEntityType:EKEntityTypeEvent];【参考方案2】:

我用来获取日历名称和类型的可用 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;

【讨论】:

^ 你永远不会释放事件存储或字典,所以这些是内存泄漏。日历可能具有相同的标题,使用它作为字典的键可能不起作用。 calendars 属性在 iOS 6 中已被弃用。 NSArray *calendars 行仅适用于 iOS 6 及更低版本,对于 6> 你需要使用这个: NSArray * calendars = [eventStore calendarsForEntityType: EKEntityTypeEvent];【参考方案3】:

我可以得到日历列表 - 问题是我没有得到用户可显示的列表。其中的 calendar.title 属性为 null;我也没有看到任何类型的 id 属性。

-> 更新:它现在对我有用。我犯的错误是将 eventStore 对象放在一个临时变量中,然后获取日历列表,然后释放 eventStore。好吧,如果你这样做,你所有的日历也会消失。在某些 iOS 框架中,包含并非严格面向对象,这就是一个例子。也就是说,日历对象依赖于事件存储,它不是它自己的独立实体。

无论如何-上面的解决方案很好!

【讨论】:

以上是关于我的应用程序如何获取用户 iPhone 上的日历列表的主要内容,如果未能解决你的问题,请参考以下文章

更改月份日历上的日期颜色

如何在iphone上的地图中获取当前位置

如何访问 iPhone 的日历以便获取会议的与会者

如何以编程方式设置 iPhone 闹钟?

如何在服务器上获取用户的日历信息?

在 iOS EventKit 上以编程方式在线获取/更新谷歌日历数据