iOS 9 学习系列:Storyboard References
http://www.cocoachina.com/ios/20150922/13474.html
如果你曾经使用 interface builder 创建过一个复杂、界面非常多的应用,你就会明白最后那些Storyboards 文件变的有多大。他会迅速变的无法管理,阻碍你的进度。自从引入 Storyboard 以来,其实是可以把你的应用的不同模块切开到不同的 Storyboard 中的。在过去,这要手动创建多个 Storyboard 文件,并且要写大量的代码。
为了解决这个问题,在 iOS 9 中苹果介绍了 Storyboard References 这个概念。Storyboard References 允许你从 segue 中引用其他 storyboard 中的 viewController。这意味中你可以保持不同功能模块化,同时 Storyboard 的体积变小并易与管理。不仅容易理解了,和团队一起工作时,合并(工作成果)也变的简单了。
简化 Storyboard
为了演示Storyboard References是如何工作的,让我们拿一个创建好的应用,并试着简化一下他的结构。这个有问题的应用已经上传到了 Github 上,如果你希望跟着做,并且看到最后的结果。以 OldMain.Storyboard 命名的文件是我们的最初文件。在这个项目中仅仅是被引用进来,我们并没有用它。如果你想从头开始跟着做,删除所有其他的 storyboard,然后把 OldMain.Storyboard 文件改为 Main.Storyboard.
下面的截图,是原来的 Storyboard 的样子。

正如你们看到的,我们使用了 TabBarController 作为初始的 viewController.这个 TabBarController 拥有三个 navigationController,每个对应一个不同的根 viewController。第一个是个 tableViewController,有一个联系人列表,第二个也是一个 tableViewController,是收藏的联系人列表。这两个都链接到一个详细页的 viewController 上。第三个 navigationController,包括了更多的信息,一个账户详细页,一个反馈页和一个关于页。
尽管应用还远称不上复杂,但是这个 Storyboard 已经非常大了。我们至少看到10个以上的 viewController,我们明白,很快就会变的难以管理。现在我们可以拆开他们了,那么从哪里开始呢?这个例子中,我们有三个不同的模块。我们可以清楚地在 tabBarController 上辨别出他们来。
我们从最简单的开始,在 Main.storyboard 的右手边,你可以看到这个给应用提供更多信息的 viewController,他是单独的,不和其他的 viewController 有链接。
我们要做的是,通过拖动选中他们(高亮显示),然后点击 Xcode 的菜单栏,选择"Editor->Refactor to Storyboard"。

给这个 storyboard 起个名字叫 More.storyboard 然后点击保存。More.storyboard 就会自动添加到应用中,并且处于打开状态。

你可以看到 storyboard 已经创建成功了。这个时候,如果你返回到 Main.storyboard 你可以看到tabBarController 其中的一个 viewController 已经变了,变成了一个指向 storyboard 的引用。

太棒了。我们把整个一部分的 UI 划分到了另外一个 storyboard 中。不仅分割开了模块,并且能够在其他地方复用。虽然在我们这个例子中用不着,但他是非常有用,有价值的新特性。
现在我们要把其他的模块也分拆开,这要比前面一步复杂一点儿,因为事实上这两部分链接了同一个viewController。两个 TableView 都通过一个 segue 展示联系人详细信息页。你可以选择怎么做?
保持 viewController 在 Main.storyboard
重构 viewController到自己的 storyboard
两种选择都可以,我个人倾向于把他们分开。所以选中详细页 viewController 然后点击 Xcode 的菜单“Editor->Refactor to Storyboard”. 给新的 storyboard 取个名字,并保存。这会创建并打开一个新的 storyboard。他会链接到联系人页和收藏的联系人页的 tableViewController 中。
现在回到 Main.storyboard 去,选中 navigation 和联系人的 tableViewController,把他们创建为新的 storyboard 引用。同样的方法把收藏的 viewController 也操作一遍。下面是操作后的结果。

我们在项目中把 Main.storyboard 拆分为了5个 storyboard。
Main.storyboard 包含一个 tabBarController 和三个链接到其他 storyboard 的 controller
Contacts.storyboard 一个导航栏和一个tableViewController,当点击一行时,链接到ContactDetails.storyboard
Favorites.storyboard 一个导航栏和一个tableViewController,当点击一行时,链接到ContactDetails.storyboard
ContactDetail.storyboard 单独的viewController展示联系人的详细信息,并且可以链接到 Contact 和 favorite 的 storyboard 中
More.storyboard 包括一个viewController,展示关于 app 的更多信息。
这个重构让我们的 storyboard 变的更加的模块化、组件化。可以帮助我们后面更好的开发这个应用。
从 Storyboard Reference 中打开一个特定的 viewController
到现在为止,我们只是分享了怎么从 storyboard 的 segue 中创建和展示 storyboard reference,还没有展示不用重构工具的情况下,如何手动添加 storyboard。
假设,我们要在联系人页的右上角添加一个“account”按钮,点击这个按钮可以快速的到达账户页查看更多信息,而无需去到设置页面里点击。
打开 Contacts.Storyboard, 拖拽一个 UIBarButtonItem 到 tableViewController 的导航栏上,把 title 设置为 “Account”。然后,找到“Storyboard Reference”控件,拖拽一个到 Contacts Storyboard上来。并且打开 attributes inspector 面板。
把 Storyboard 属性选为“more”,把 Referenced ID 属性设置为“accountViewController”。这允许我们引用账号信息页的 viewController,而不是链接到 more storyboard 的初始 view controller上。

选中“account”的按钮,按住 Control 健和鼠标左键,拖拽到 storyboard reference上,这样就创建了一个 segue。

最后一步是,设置 accountViewController 的 identifier。打开 More.storyboard 选中 accountViewController,打开 identity inspector 设置 Storyboard ID 为 “accountViewController”。这样,当你点击 account 按钮时,就会转到账号的详细页面去。
如果所见,添加 Storyboard Reference,无论是通过重构工具还是手动添加都非常简单、直接、有效。他允许你创建更加组件化、可复用化、模块化的应用。最后,这个指南的最终结果可以在Github 上查看。
延伸阅读
查看更多关于 Xcode 7 的 Storyboard References 的内容,可以观看 WWDC 2015 的 session 215. What's New in Storyboards。前20分钟讲的正是 Storyboard References 的内容。
iOS 9 学习系列:Storyboard References的更多相关文章
- iOS/iPhone学习系列、代码教程
part 1--入门: 1. xcode 版本下载 以及 iphone sdk 下载: 最新版本在此下载: http://developer.apple.com/devcenter/ios/index ...
- iOS 9学习系列:打通 iOS 9 的通用链接(Universal Links)
在WWDC 2015 上, Apple 为 iOS 9 宣布了一个所谓 通用链接 的深层链接特性, 视频地址为 [无缝链接到您的 App].虽然它不是一个必须实现的功能, 但还是需要引起一些注意. 在 ...
- iOS 9 学习系列: Xcode Code Coverage
Code coverage 是一个计算你的单元測试覆盖率的工具. 高水平的覆盖给你的单元測试带来信心.也表明你的应用被彻底的測试过了. 你可能写了几千个单元測试,但假设覆盖率不高.那么你写的这套測试可 ...
- iOS 9 学习系列:Split Screen Multitasking
http://www.cocoachina.com/ios/20151010/13601.html iOS 9 的一个重大变化就是增加了多任务,这个多任务允许用户在屏幕上同时运行多个 app.有两种形 ...
- iOS 9 学习系列:UIStack View
http://www.cocoachina.com/ios/20150921/13492.html 在 iOS9 中,Apple 引入了 UIStackView,他让你的应用可以通过简单的方式,纵向或 ...
- iOS 9 学习系列:UIStack View (转载)
作者:Nathan_Bao 地址:http://www.jianshu.com/p/1991e6c2881a 在 iOS9 中,Apple 引入了 UIStackView,他让你的应用可以通过简单的方 ...
- iOS之Storyboard References
如果你曾经使用 interface builder 创建过一个复杂.界面非常多的应用,你就会明白最后那些Storyboards 文件变的有多大.他会迅速变的无法管理,阻碍你的进度.自从引入 Story ...
- iOS学习系列 - 扩展机制category与associative
iOS学习系列 - 扩展机制category与associative category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 ...
- 开篇:软件项目的整个流程 - IT软件人员学习系列文章
这段时间闲来无事,就在总结以前的项目经验,然后写成博客的形式以进行记录.本文就对<IT软件人员学习系列文章>做个开篇吧. 对于IT软件的开发来说,无外乎B/S.C/S和Android.iO ...
随机推荐
- 88 Lowest Common Ancestor of a Binary Tree
原题网址:https://www.lintcode.com/problem/lowest-common-ancestor-of-a-binary-tree/description 描述 给定一棵二叉树 ...
- 469 Same Tree
原题网址:https://www.lintcode.com/problem/same-tree/description 描述 检查两棵二叉树是否等价.等价的意思是说,首先两棵二叉树必须拥有相同的结构, ...
- 【agc013d】AtCoder Grand Contest 013 D - Piling Up
题意 盒子里有n块砖,每块的颜色可能为蓝色或红色. 执行m次三步操作: 1.从盒子里随便拿走一块砖 2.放入一块蓝砖和红砖到盒子里 3.从盒子里随便拿走一块砖 给定n,m 问拿出来的砖,可能有多少种不 ...
- MyBatis-Spring(四)--MapperFactoryBean实现增删改查
上一篇文章中提到,使用SqlSessionTemplat时需要输入一长串字符串来获取mapper,这种方式IDE不会检查程序的准确性并且很容易出错,所以这篇文章介绍另一种可以避免这种问题,并且也可以使 ...
- PHP中的符号 ->、=> 和 :: 的含义(用法)
php新手经常碰到的问题,->.=> 和 :: 这三个家伙是什么分别都是做什么的啊!看着就很晕. 没关系,下面我们做一下详细的解释,如果你有C++,Perl基础,你会发现这些家伙和他们里面 ...
- java监控文件夹下的文件变化使用jnotify
https://blog.csdn.net/codepython/article/details/42341243?utm_source=blogxgwz1 使用jnotify https://blo ...
- Hibernate-HQL-Criteria-查询优化
1 查询总结 oid查询-get 对象属性导航查询 HQL Criteria 原生SQL 2 查询-HQL语法 2.1 基础语法 2.2 进阶语法 排序 条件 分页 聚合 投影 多表查询 SQL HQ ...
- 关于apache kylin 安装32位linux办法
最近公司在使用apache kylin做实时开发访问,但是自己集群是linux32 只能安装JDK32位的受限只能3G多内存,而apachekylin 默认是4G内存,需要JDK64位支持. 解决办法 ...
- uva11401:Triangle Counting 递推 数学
uva11401:Triangle Counting 题目读不清楚的下场就是多做两个小时...从1-n中任选3个不重复数字(不重复啊!!坑爹啊!)问能组成三角形的有多少个, 显然1~n能组成的三角形集 ...
- spring源码学习之AOP(一)
继续源码学习,看了spring中基础的容器和AOP感觉自己也没有什么长进,哈哈,我也不知道到底有用没有,这可能是培养自己的一种精神吧,不管那么多,继续学习!AOP中 AOP中几个重要的概念:(1)Ad ...