当前位置:首页>编程日记>正文

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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


我们知道如果想在iOS中自带的日历App中创建闹铃开始的时间,这个时间只能从给定几个值中选择一个:

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

选好完毕后的状态如下:

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

如果我们有特殊的定时要求该怎么办?比如我们想在日历事件开始前7秒钟订一个闹铃该如何去做?

下面本猫将带大家一起一步一步完成这一功能.

一.获取日历读写许可

首先大家要知道,如果要操作系统日历数据库,我们必须获得对应权限:

EKEventStore *eventStore = [EKEventStore new];switch ([EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent]) {case EKAuthorizationStatusAuthorized://我们已经取得了想要的权限break;case EKAuthorizationStatusDenied:[self displayAccessDenied];break;case EKAuthorizationStatusNotDetermined:{[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted,NSError *error){if (granted) {//用户现在许可我们读写日历数据库}else{[self displayAccessDenied];}}];break;}case EKAuthorizationStatusRestricted:[self displayAccessRestricted];break;default:break;}

注意检查许可我们使用的是EKEventStore authorizationStatusForEntityType:类方法,而获取许可我们使用的却是EKEventStore的实例方法requestAccessToEntityType:,这点不要搞混淆.
上面代码中的eventStore实例变量,你可以理解为是日历数据库的抽象.你可能会问为何不用一个单例对象而要new出一个实例变量?一种可能是iOS希望访问日历的方法可以线程安全.

二.找到对应的日历源

接下来我们需要找到特定的日历源,它是EKSource的实例对象.日历源你可以理解为是一些按照日历类型去分类的组.比如在以下模拟器中:

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

我们可以看到日历数据库共包括了2个日历源,分别是Default和OTHER.你会说第一个源名字不是叫ON MY IPHONE么?你说的Default有时从哪里冒出来的?这个别急,我们会在后面的代码中开到Default名称的由来,你现在只要知道显示在上图中第一个日历源的名称不是真实的名称,它多半是让用户便于理解的而设置的别名.

再举个真机上的例子:

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

可以看到以上图片是从iPhone6p(iOS9.2.1)拷屏而来的,其中第一个日历源名称为ICLOUD,其中包括了很多日历.我们必须牢记,一台iOS设备(或者Mac设备)上可以有若干个Apple ID,每个Apple ID的日历数据库里可以有若干个日历源,每个日历源里可以有若干个日历.

当然你也可以不通过日历源来枚举日历,你可以直接枚举指定EKEventStore实例中的日历:

NSArray *calendarTypes = @[@"Local",@"CalDAV",@"Exchange",@"Subscription",@"Birthday"];NSArray *calendars = [store calendarsForEntityType:EKEntityTypeEvent];NSUInteger i = 1;for (EKCalendar *calendar in calendars) {NSLog(@"Calendar %lu Title = %@",(unsigned long)i,calendar.title);NSLog(@"Calendar %lu Type = %@",(unsigned long)i,calendarTypes[calendar.type]);NSLog(@"Calendar %lu Color = %@",(unsigned long)i,[UIColor colorWithCGColor:calendar.CGColor]);if ([calendar allowsContentModifications]) {NSLog(@"Calendar %lu can be modified.",(unsigned long)i);}else{NSLog(@"Calendar %lu cannot be modified.",(unsigned long)i);}i++;}

如果你觉得这样定位日历更快,那么OK!这没问题.不过下面我们来看另一种从指定日历源中枚举日历的方法,下篇再见.


http://www.coolblog.cn/news/76f2cc7e819a1887.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • 2019-9
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • linux批量创建用户和密码
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • js常用阻止冒泡事件
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • 《看透springmvc源码分析与实践》读书笔记一
  • Arm芯片的新革命在缓缓上演
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐