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方法,和保存方法极为类似。

你可能感兴趣的:(ios,osx,日历,event)