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

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


首先推荐大家看这本书,整本书逻辑非常清晰,代码如何从无到有,到丰满说的很有条理.

说实话本书到目前为止错误还是极少的,不过人无完人,在第14章前半部分项目的代码中,作者在MasterVC到DetailVC中又直接添加了一个segue,该segue的ID为”masterToDetail”,作用是当新建一个tinyPix文档时可以直接跳转到DetailVC来编辑文档.

作者同样意识到如果直接从MasterVC的表视图cell直接转到DetailVC时也需要做一些额外的操作,该操作的作用是,当用户点击已存在的tinyPix时跳转到DetailVC中打开已存在的文档.

作者是这样修改prepareForSegue::方法的:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if (sender == self) {
        UIViewController *destination = segue.destinationViewController;
        if ([destination respondsToSelector:@selector(setDetailItem:)]) {
            [destination setValue:_chosenDoc forKey:@"detailItem"];
        }
    }else{
        NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow;
        NSString *filename = _docFilenames[indexPath.row];
        NSURL *docUrl = [self urlForFilename:filename];
        _chosenDoc = [[HyTinyPixDocument alloc]initWithFileURL:docUrl];
        [_chosenDoc openWithCompletionHandler:^(BOOL success){
            if (success) {
                UIViewController *destination = segue.destinationViewController;
                if ([destination respondsToSelector:@selector(setDetailItem:)]) {
                    [destination setValue:_chosenDoc forKey:@"detailItem"];
                }
            }else{
                NSLog(@"failed to load!");
            }
        }];
    }
}

但是实际执行App时发现点击已存在的tinyPix文件并不能正确在DetailVC中显示文档的内容.在上述方法的else分支后下断点,发现由TableViewCell跳转而来的代码其segue.destinationViewController并不是我们希望的DetailViewController,而是UINavigationController.而后者自然不存在神马setDetailItem:方法.

我不知道这是作者的笔误还是什么其他原因,或者是新版的Xcode中Master-Detail Application模板发生了变化?但至少在Xcode7.2中情况是这样.

那么如何修复这个问题呢?其实比你想象的要简单,修改如下:

if (success) {
                //UIViewController *destination = segue.destinationViewController;
                DetailViewController *detailVC = (DetailViewController*)[
                                        segue.destinationViewController topViewController];
                if ([detailVC respondsToSelector:@selector(setDetailItem:)]) {
                    [detailVC setValue:_chosenDoc forKey:@"detailItem"];
                }
            }else{
                NSLog(@"failed to load!");
            }

在这里我们需要的是destinationVC的topViewController对象,而不是destinationVC本身.

编译连接App,现在两种方法进入到DetailVC都表现正常了:

<<精通iOS开发>>第14章例子代码小缺陷的修复的更多相关文章

  1. <<精通iOS开发>>第14章例子代码彻底清除警告

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们解决了<<精通iOS开发>> ...

  2. 精通iOS开发(第5版)

    <精通iOS开发(第5版)> 基本信息 原书名:Beginning ios 6 development:exploring the ios sdk 作者: (美)David Mark   ...

  3. 【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2

    原文网址:http://bbs.51cto.com/thread-1099956-1.html 亲爱的学员们: 如今,各路开发者为淘一桶金也纷纷转入iOS开发的行列.你心动了吗?想要行动吗?知道如何做 ...

  4. 学习ios(必看经典)牛人40天精通iOS开发的学习方法

    学习ios(必看经典)牛人40天精通iOS开发的学习方法 描述 这是一套从一个对iOS开发感兴趣的学员到iOS开发高手的系统.专业的课程体系.以培养企业开发真正需要的人才为目标,每个知识点都用案例来讲 ...

  5. ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

    本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...

  6. 盘点国内程序员不常用的热门iOS第三方库:看完,还敢自称”精通iOS开发”吗?【转载】

    综合github上各个项目的关注度与具体使用情况,涵盖功能,UI,数据库,自动化测试,编程工具等类型,看完,还敢自称”精通iOS开发”吗? https://github.com/syedhali/EZ ...

  7. iOS开发 swift 3dTouch实现 附代码

    iOS开发 swift 3dTouch实现 附代码 一.What? 从iphone6s开始,苹果手机加入了3d touch技术,最简单的理解就是可以读取用户的点击屏幕力度大小,根据力度大小给予不同的反 ...

  8. IOS开发 arc与非Arc代码的区别

    是属于ios开发中的内存管理问题:在这我简要概述一下,详细讲的话内容挺多,而且是作为一个ios开发人员,或ios开发爱好者,这是必须了解的:Objective-c中提供了两种内存管理机制MRC(Man ...

  9. IOS开发退出应用程序的代码

    IOS 开发中.我知道的两个退出程序的方法: 1. exit(0); 2. if([[UIApplication sharedApplication] respondsToSelector:@sele ...

随机推荐

  1. [bzoj4864][BeiJing 2017 Wc]神秘物质

    来自FallDream的博客,未经允许,请勿转载,谢谢. 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研 ...

  2. [BZOJ]1017 魔兽地图DotR(JSOI2008)

    BZOJ第一页做着做着就能碰到毒题,做到BZOJ1082小C就忍了,没想到下一题就是这种东西.这种题目不拖出来枭首示众怎么对得起小C流逝的青春啊. Description DotR (Defense ...

  3. 简述RIP路由协议和OSPF路由协议的相同点和不同点。

    路由协议分为静态路由协议和动态路由协议.动态路由协议有很多种,如RIP.OSPF.EIGRP等. 1.RIP(路由信息协议)是路由器生产商之间使用的第一个开放标准.RIP有两个版本:RIPv1和RIP ...

  4. python3全栈开发-多进程的守护进程、进程同步、生产者消费者模式(重点)

    一.守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes a ...

  5. 数据结构之并查集Union-Find Sets

    1.  概述 并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 2.  基本操作 并查集 ...

  6. ubuntu 14.04 64位 安装Opencv3.1.0 (包含opencv_contrib模块)

    写在前边: 据官方说法,目前还不是太稳定的算法模块都在opencv_contrib里边,由于不稳定,所以不能在release版本里发行,只有在稳定以后才会放进release里边.但是这里边有很多我们经 ...

  7. git提交项目常用命令及git分支的用法

    1.第一步首先从git托管平台clone项目,我这里就使用idea为例: 填写git的url与存放本地目录名及项目名     2.如果你对项目进行了一些修改,就可以执行git命令,进行提交. 有两种方 ...

  8. VMWare 虚拟机 共享文件夹

    1.不能拷贝和直接拖拽文件至虚拟机系统中  解决办法:    通过共享文件夹的方式进行文件共享.   (Win7 32位  10.0版本的虚拟机). ①:选择虚拟机 虚拟机 → 设置  如下图: ②: ...

  9. Vue2.0搭建脚手架流程

    介绍 Vue.js是一套构建用户界面的渐进式框架.Vue 只关注视图层,采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 安装node.js ...

  10. MySQL 字符串截取SUBSTRING()函数

    MySQL 字符串截取相关函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例: select left(content,200) as ab ...