iOS9中如何在日历App中创建一个任意时间之前开始的提醒(二)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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;
}

上面代码很简单,不用我再碎碎念了.

时间: 2024-08-01 10:10:02

iOS9中如何在日历App中创建一个任意时间之前开始的提醒(二)的相关文章

iOS9中怎样在日历App中创建一个随意时间之前開始的提醒(三)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 四.创建随意时间之前開始的提醒 如今我们找到了指定源中的指定日历,剩下要做的就是在日历中创建一个事件,而且设置其对于的提醒.我们能够创建2种类型的事件:单一的和循环的(或者称之为反复的).这里为了简单起见(KISS),我们仅仅创建单一的事件: -(void)addAlarmToCalendar:(EKCalendar*)calendar inStore:(EK

React漫漫学习路之 利用Create React App命令创建一个React应用

所谓万事开头难,本文旨在为初探React的同学,建立第一个最基本的react应用. Create React App是Facebook官方的一个快速构建新的 React 单页面应用的脚手架工具,它可以帮你配置开发环境,以便你可以使用最新的 JavaScript 特性,还能提供很棒的开发体验,并为生产环境优化你的应用.(如果你使用过vue-cli构建vue应用,那么此处可类比) 话不多说,直接开始. 安装 全局安装create-react-app npm install -g create-rea

Fiddler中如何抓取app中https(443端口)数据

Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获手机发出的HTTP/HTTPS请求,总结下Fiddler截获IPhone和Android发出的HTTP/HTTPS包,前提条件是:安装Fiddler的机器,跟Iphone.Android在同一个网络里, 否则手机不能把HTTP发送到Fiddler的机器上来. 如果你遇到了这个坑:手机上已经设置好代理,开启代理后,却发现手机上不了网. 那么应该是和电脑防火墙有关,此时需要设置下防火墙,如过设置无效或者不知道怎么设置的话直接将防火墙暂

创建一个当前时间凌晨

//设置一天内的一个时间点 Calendar cal = Calendar.getInstance();         cal.set(Calendar.HOUR_OF_DAY, 0);//设置一天中的某一消失         cal.set(Calendar.MINUTE, 0);//设置分钟 cal.set(Calendar.SECOND, 0);//设置秒         cal.set(Calendar.MILLISECOND, 0);//设置毫秒 Timestamp time = n

创建一个dynamics 365 CRM online plugin (十二) - Asynchronous Plugins

这篇是plugin的终结. 通过之前的11期我们应该发现了plugin其实学习起来不难. async plugin 是把plugin的功能async run起来. e.g.  我们之前做过的preOperation的plugin会马上执行并且马上有数据显示在entity中. 但是async plugin会在async 形式下run, 使用场景是有很大的计算量或者处理量会导致CRM server进程被block 掉. 我们可以在plugin registeration tool中选择是否需要asy

Asp.Net Web Forms/MVC/Console App中使用Autofac

本来简单介绍了Autofac在Asp.Net Web Forms中的应用,后来又添加了mvc.控制台应用程序中使用Autofac,详情请看源码. ASP.NET Web Forms使用Autofac,至少需要一下步骤: 1,引用Autofac程序集. 2,添加Autofac Web Modules 到 Web.config. 3,在Global.asax中实现IContainerProviderAccessor接口. 我们创建一个ASP.NET Web Forms项目,命名为WebFormStu

在Eclipse中创建一个ABAP项目

第1步:下载,安装并启动Eclipse IDE ABAP开发是在Eclipse IDE中使用自定义ABAP工具完成的.如果您尚未安装Eclipse,请下载适用于Java开发人员的Eclipse IDE,然后立即安装并启动该应用程序. 第2步:为SAP NetWeaver(ADT)安装ABAP开发工具 在Eclipse菜单栏中,选择:帮助>安装新软件... 在对话框中添加URL https://tools.hana.ondemand.com/neon(例如Eclipse Neon 4.6) 按En

创建一个自定义的Application类

由于每个应用程序必须创建一个Application对象,vs为开发人员提供了模板来减轻开发人员的重复工作.当使用vs创建一个WPF应用程序是,vs会自动创建一个app.xaml文件, <Application x:Class="WpfApplication8.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.mi

使用Spring Boot创建一个应用

本文主要演示如何使用Spring Boot加速应用开发的.你可以访问Spring Initializr,快速构建属于你自己的基于Spring Boot的应用. 如图,一键即可生成项目. 1.开始构建项目 1.1)项目结构 1.2 pom.xml <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmln