EventKit

这是在IOS和OS X下都可以使用的框架。用来读取,修改和创建日历上的事件。
事件被储存在一个事件储存库中,这个库中会包含多个日历,他们都是EKCalender对象。每个事件都是一个EKEvent对象,包括描述文本,起止时间,事件的位置,事件的创建时间和上一次的修改时间。
创建一个事件库的实例:

lazy var store: EKEventStore = EKEventStore()

要访问用户的日历当然是需要许可的,使用下面的方法来访问:

self.store.requestAccessToEntityType(EKEntityType.Event) { (success:Bool, error:NSError?) -> Void in
    //布尔值代表是否成功获取权限,error会在不成功时返回原因
    print("Got permission = \(success);error = \(error)")
}

日历有两种,支持事件的和支持提醒的,在获取日历时使用相同的方法不同的参数来获得,这个方法会返回一个EKCalendar的数组,里面包含符合要求的日历:

self.store.calendarsForEntityType(EKEntityType.Event) as [EKCalendar]//EKEntityType.Reminder

要访问日历中的事件,需要提供一个查询条件,因为有些重复事件是没有尽头的,你不可能获取一个无限长的事件列表。在这里我们使用NSPredicate来进行筛选。

let endDate = date.dateByAddingTimeInterval(24 * 60 * 60)
let predicate = self.store.predicateForEventsWithStartDate(self.date, endDate: endDate, calendars: self.calenders)
self.store.eventsMatchingPredicate(predicate)

这样我们就获取了我们需要的事件数组。
我们可以读取,修改,删除它。当然我们也可以新建。
修改很简单,我们只需要拿到event然后对它的各个属性赋值就好了,新建也一样,新建一个EKEvent对象并对其各个属性赋值。在保存时要注意,你从哪个EKEventStore里读出来的就要存回哪个EKEventStore,否则是会报错的。你要是想存在另一个EKEventStore里,那么新建一个,把各个属性拿过来,再存到新的里面。保存调用下面这个方法:

store.saveEvent(event, span: EKSpan.ThisEvent, commit: true)

其中的EKSpan代表储存的选项,共有两个选项,本事件或未来事件,对于单一事件来说选择本事件肯定是没错的,对于重复事件,这个选项决定了是只修改这一个事件还是修改未来所有的重复事件。
还有一个问题,就是在你修改事件的过程中如果事件发生了变化该怎么处理。
日历发生变化时都会发出EKEventStoreChangedNotification,调用EKEvent的refresh方法即可刷新这个事件,但是你已经修改过的属性并不会被更新。
删除使用removeEvent方法,和保存方法极为类似。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,466评论 25 708
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,178评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,977评论 19 139
  • 大家好,我是超人小飞飞。这篇文章比较长,整篇读完需要15-20分钟。 这个题目比较大,并且没有标准答案,我以自己的...
    超人小飞飞阅读 5,794评论 17 67
  • 几天时间看完了『斜杠青年』这本书。原以为和其他看过的目的性书籍一样,很快可以看完并总结。实际上花了不少时间在阅读及...
    丽芙奇阅读 543评论 1 3