如果你曾经使用 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 上查看。

 

 

iOS之Storyboard References的更多相关文章

  1. iOS 9 学习系列:Storyboard References

    http://www.cocoachina.com/ios/20150922/13474.html 如果你曾经使用 interface builder 创建过一个复杂.界面非常多的应用,你就会明白最后 ...

  2. StoryBoard拆分(Storyboard References)

    https://www.jianshu.com/p/78dc76204c8e iOS UI篇10- Storyboard(Storyboard Reference) https://www.aliyu ...

  3. ios 关于StoryBoard 的简易使用说明

    ios 关于StoryBoard 的简易使用说明 http://www.tuicool.com/articles/FNRruy

  4. 关于 iOS 的 StoryBoard,接受的那一刻才发现她的美 - 当然美的事物都须要业心照料

    关于 iOS 的 StoryBoard,接受的那一刻才发现她的美 - 当然美的事物都须要业心照料 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循&quo ...

  5. 【Xamarin 开发 IOS --使用 Storyboard Segue 实作 UIViewController 的切换 (实例)】

    注意:在vs2015中进行画板之间的导航的时候,使用CTRL+鼠标左键进行导航的设定. 使用 NavigationController 进行 画板的链接.... 使用 Storyboard Segue ...

  6. iOS 使用Storyboard 和 xib时的一些知识

    以前不太使用xib和storyboard进行布局,后来在工作中参与到了一个项目的维护工作,那个项目就是使用stroyboard的,再加上xcode5对stroyboard的大力支持,就在这里对于使用s ...

  7. iOS 调出storyboard里面起始Controller的箭头

    在storyboard里面,如果第一个ViewController不是默认的ViewController的时候,我们就需要拖拽一个出来. 如果把默认的ViewController删掉的话,前面的箭头, ...

  8. (iOS)Storyboard/xib小技巧

    1.选择被view覆盖住的view 当你想直接在view中选择自己想要的元素时,但是又碍于一个view上叠加的元素太多很难直接选中,那么在这时,你同时按住键盘上的shift和 control键,然后在 ...

  9. [初探iOS开发]storyboard的使用

    storyboard的目的是为了方便的设计程序view之间的关系,使得程序员把精力都放到核心业务逻辑之上.

随机推荐

  1. [Hive - LanguageManual] Sampling

    Sampling Syntax Sampling Bucketized Table Block Sampling Sampling Syntax  抽样语法 Sampling Bucketized T ...

  2. [Hive - Tutorial] Type System 数据类型

    数据类型Type System Hive supports primitive and complex data types, as described below. See Hive Data Ty ...

  3. [转]python起步之卡尔曼滤波

    原文地址:http://www.niwozhi.net/demo_c65_i50946.html 关于卡尔曼滤波的理论这里不打算讲了,就是那个5个基本的公式,这里直接给出公式: 公式1:X(k|k-1 ...

  4. 【Hadoop代码笔记】Hadoop作业提交之Child启动map任务

    一.概要描述 在上篇博文描述了TaskTracker启动一个独立的java进程来执行Map或Reduce任务.在本篇和下篇博文中我们会关注启动的那个入口是org.apache.hadoop.mapre ...

  5. Java中快如闪电的线程间通讯

    这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...

  6. 利用管道实现Shell多进程

    shell中有个&,表示该程序在后台执行,其实是fork了一个子进程,跟系统调用是一样的. 在实际的操作过程中,有时需要控制后台程序的个数,毕竟启动太多的后台,会对服务的性能造成影响. 所以需 ...

  7. HDU 2063 过山车(二分匹配入门)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 二分匹配最大匹配数简单题,匈牙利算法.学习二分匹配传送门:http://blog.csdn.ne ...

  8. Velocity中#set指令

    引用可以让模板设计者生成动态内容,而指令允许设计者真正的负责页面的展现和内容. 指令是以#开头,后面紧跟一个关键字,比如if,else,foreach等.而这个关键字,是可以被放在{}中间的.这是规范 ...

  9. 【多校练习4签到题】HDU 4642—— Fliping game

    来源:点击打开链接 看上去很难,比赛的时候光看hehe了,也没有想. 但是仔细想想,是可以想出来的.一个棋盘上每个格子摆放一个硬币,硬币有正面1和反面0之分.现在两个人可以按照规则翻硬币,选择(x,y ...

  10. 解决mysql 1040错误Too many connections的方法

    从官方文档知道linux上面编译安装的mysql默认的连接为100个,这样对于网站的需求来说是远远不够的. mysql官方告诉我们需要修改max_connections的值,那么我们怎么去修改呢?有两 ...