iOS编程Cookbook第19章最后一个例子不能正常工作的解决办法

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

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)



在Cookbook的第19章的11节中所要解决的是在App中显示iOS自带的日历编辑视图的问题.

例子代码是选择迄今为止1年前的第一个找到的日历事件,然后将其显示在日历编辑视图中.

日历编辑视图控制器是EKEventEditViewController的实例对象,按照书上的说明,其有一个event实例变量,如果在显示该控制器之前不对其赋值,即其值为nil则出现的是一个新增Event的View,如果对其赋值一个特定的Event对象,则显示的是编辑该Event的视图.

具体代码如下:

-(void)displayEventEditController{
    EKSource *icloudSource = [self sourceInEventStore:self.eventStore sourceType:EKSourceTypeCalDAV sourceTitle:@"iCloud"];
    if (!icloudSource) {
        NSLog(@"iCloud source don‘t exist!!!");
        return;
    }
    NSSet *calendars = [icloudSource calendarsForEntityType:EKEntityTypeEvent];
    NSTimeInterval OneYear = 1*365*24*60*60;
    NSDate *startDate = [[NSDate date]dateByAddingTimeInterval:-OneYear];
    NSDate *endDate = [NSDate date];
    NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:calendars.allObjects];
    NSArray *events = [self.eventStore eventsMatchingPredicate:predicate];
    if (events.count > 0) {
        EKEvent *event = events.firstObject;
        EKEventEditViewController *controller = [EKEventEditViewController new];
        controller.event = event;
        controller.editViewDelegate = self;
        [self.navigationController presentViewController:controller animated:YES completion:nil];
    }
}

但是在实际运行该App时发现,如果不修改选择Done或者Cancel,则没有问题.只要对原有Event进行修改再保存,都会显示错误:

Calendar: unable to save: (null)

但是从字面上不知道是神马地方出错了!

同样的Event从iOS自带的日历App中修改是没有问题的.

后来查找了文档,其中有说明:必须设置日历编辑视图控制器的eventStore实例变量为正确的stroe对象,否则不能保存.

于是将上述代码在显示控制器前位置插入以下一行即可:

controller.eventStore = self.eventStore;

再次运行App,现在可以正常保存Event了 ;)

时间: 2024-10-07 19:42:38

iOS编程Cookbook第19章最后一个例子不能正常工作的解决办法的相关文章

iOS 中 #error宏 的使用的一个例子

头文件中如下定义宏: /** * @brief 默认空间名(必填项) */ #error 必填项 #define DEFAULT_BUCKET @"" /** * @brief 默认表单API功能密钥 (必填项) */ #error 必填项 #define DEFAULT_PASSCODE @"" 类的实现中使用: self.bucket = DEFAULT_BUCKET; self.passcode = DEFAULT_PASSCODE; 这样,如果没有初始化这两

IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法

在 IOS 开发当中经常碰到 whose view is not in the window hierarchy 的错误,该错误简单的说,是由于 "ViewController" 还没有被夹在,就调用该 ViewController 或者 ViewController 内的方法时,就会报这个错误. 在不同地方调用 ViewController,解决的方法也不太一样. 1. 在 一个 ViewController 里面调用另外一个 ViewController 是出现这个错误: 该错误一

C#使用oledb连接excel执行Insert Into语句出现“操作必须使用一个可更新的查询”的解决办法

我发生错误时的环境:Windows 7,Framework 4.0,Microsoft Office 2007,VS2010,c# WinForm: 部分代码: string strConn = "Provider=Microsoft.Ace.OleDb.12.0;Persist Security Info=False;" + "data source=" + @excelPath + ";Extended Properties='Excel 12.0;

iOS自定义tabbar后popToRootViewContriller和poptoviewcontroller时出现两个tabbar 的解决办法

iOS自定义tabbar后popToRootViewContriller和poptoviewcontroller时出现两个tabbar  的解决办法 问题:iOS自定义tabbar后popToRootViewContriller和poptoviewcontroller时出现两个tabbar 1.自定义代码: - (void)viewWillAppear:(BOOL)animated { [super  viewWillAppear:animated]; // 删除系统自动生成的UITabBarB

分享一个控制JS 浏览器缓存的解决办法。

 JS 缓存的问题一直都是我们又爱又恨的东西.也是我们比较头痛的问题, 一方面为了提高网站响应速度,减少服务器的负担,和节省带宽,将需要将静态资源缓存在客户端, 但是另一方面,当js 文件有改动的时候,如何快速的将客户端缓存的js文件都失效,这是非常头痛的问题. 以至于每次客户反馈问题的时候,我们第一个解决办法都是清理浏览器缓存. 那么如何解决呢. 1. 直接禁止全部的静态文件缓存 在html 头部加上如下代码: <META HTTP-EQUIV="pragma" CONTENT

使用oledb读写excel出现“操作必须使用一个可更新的查询”的解决办法

使用oledb读写excel出现"操作必须使用一个可更新的查询"的解决办法 转自:http://www.cnblogs.com/Richinger/archive/2008/09/28/1301170.html 前两天使用oledb连接excel的办法为单位某部门从一个excel的多个sheet中作连选抽出需要的数据,程序非常简单,结果很快就出来,原来手工需要很长时间才能选出的结果现在几乎一点击就有了结果.使用人员非常满意,由于是多人使用,开始只是将结果显示在一个页面上.后来他们要求将

oracle 表被另一个用户锁住后的解决办法

oracle 表被另一个用户锁住后的解决办法 1.查看数据库锁,诊断锁的来源及类型: select object_id,session_id,locked_mode from v$locked_object; 2.找出数据库的serial#,以备杀死: select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by

JavaScript Dom编程艺术 第6章的一个错误

今天在看JavaScript Dom编程艺术 第6章:图片库的改进版时:按照书上的代码,敲出来运行,确怎么也不能显示出正确的结果.加进去断点,调试,发现:prepareGallery 函数根本没被调用,而prepareGallery函数是绑定到window.onLoad事件上的,于是仔细检查书上代码,发现,window.onLoad = prepareGallery;后边少加了个括号.加上括号之后,结果正确.改正后的代码如下: 1 function addLoadEvent(func){ 2 v

安卓权威编程-笔记(19章 使用SoundPool播放音频)

针对BeatBox应用,可以使用SoundPool这个特别定制的实用工具. SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件.因此所以,就算用户兴奋起来,狂按按钮播放全部音频,也不必担心会损坏应用或者耗光手机电量. 1. 创建SoundPool 1 /* 2 * Lollipop引入了新的方式创建SoundPool:使用SoundPool.Builder.为了兼容api 16最低级别,只能选择使用SoundPool(int int int)这个老构造方法. 3 * 第一个