大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
接上一篇,我们来看一下如何根据类型和名称找到一个特定的日历源,首先我们写一个帮助方法:
-(EKSource*)sourceInEventStore:(EKEventStore*)store sourceType:(EKSourceType)type sourceTitle:(NSString*)title{
for (EKSource *source in store.sources) {
if (source.sourceType == type && [source.title caseInsensitiveCompare:title] == NSOrderedSame) {
return source;
}
}
return nil;
}
我们当然可以只通过日历源的title来查找,不过加上对其类型的检查可谓是双保险.我们在上述方法的开头位置下断点,在模拟器中运行App,不出意外应该会在该断点中断下来,我们在debug console中输入:
po store.sources
可以看到模拟器中所有日历源的输出:
(lldb) po store.sources
<__NSArrayI 0x787939e0>(
EKSource <0x78792770> {UUID = 705E0A9A-1FD0-4B56-B7D9-CA4E268ECF90; type = Local; title = Default; externalID = (null)},
EKSource <0x787939a0> {UUID = F2F63129-2812-48C0-80B8-AFCEFFF9AC84; type = Other; title = Other; externalID = (null)}
)
可以看到日历数据库中第一个日历源的真正名称为Default,而后面一个名称为Other.这就印证了我在第一篇中说的,在模拟器中显示的第一个日历源的名称只是一个便于用户理解的别名.
如果在真机中运行呢?你会发现第一个日历源的名称为iCloud.区别是前者是一个本地的源(EKSourceTypeLocal),后者是一个远程的源.这里多说几句,远程的日历源也有很多种类型,比如:
EKSourceTypeExchange
EKSourceTypeCalDAV
它们分别表示两种不同的日历通讯协议,用来同步客户端和服务器端上的日历内容.感兴趣的童鞋可以自行度娘谷哥搜寻.
现在我们可以肯定模拟器中的Default源是本地源,而iCloud源是一个CalDAV类型的远程源.
下面我们就按照上面我们分析过的内容来分别获取Default和iCloud源:
//获取iCloud源
EKSource *icloudSource = [self sourceInEventStore:store sourceType:EKSourceTypeCalDAV sourceTitle:@"iCloud"];
//获取本地Default源
EKSource *localSource = [self sourceInEventStore:store sourceType:EKSourceTypeLocal sourceTitle:@"Default"];
现在我们获取到了一个日历源,那么怎么获取其中某一个日历呢?日历在EventKit的表示为一个EKCalendar的实例,我们同样写一个帮助方法:
-(EKCalendar*)calendarWithTitle:(NSString*)title type:(EKCalendarType)type inSource:(EKSource*)source forEventType:(EKEntityType)eventType{
for (EKCalendar *calendar in [source calendarsForEntityType:eventType]) {
if ([calendar.title caseInsensitiveCompare:title] == NSOrderedSame && calendar.type == type) {
return calendar;
}
}
return nil;
}
上面代码很简单,不用我再碎碎念了.