打算分享一些有争议的话题,并且表达一下我的看法。这是该系列的第二篇。
在本文中,我想讨论的是:对于 UI 界面的编写工作,到底应该用 xib/storyboard 完成,还是用手写代码来完成?
本着 “使用过才有发言权” 原则,我介绍一下我的经历:
除了我本人的经历外,我也调研了一下我手机中装的所有的 App 的开发情况,我写了一个脚本,分析了我手机中一共 100 多个 App 包含的 xib 文件的个数。通常情况下一个 App 如果完全通过 xib/storyboard 来完成的话,那么编写包含的 xib 个数不应该少于 10 个(注:storyboard 在打包时会被拆解成多个它包含的 xib 文件)。
这个调研的最终结果,以及我分析用的脚本源码在 这里 。我挑了一些比较有名的应用列在下面。(我另外也列出了它们包含的 js 的文件数量,这个可以反应出该应用对基于 UIWebView 的 Hybrid 编程的使用情况,不过与本次讨论主题无关。)
软件名字 | nib 文件数 | js 文件数 |
---|---|---|
Mailbox 2.3.3.ipa | 0 | 0 |
Twitter 6.0.1.ipa | 0 | 0 |
objcio 1.0.3.ipa | 0 | 0 |
播客 2.0.ipa | 0 | 0 |
知乎日报 2.5.ipa | 1 | 2 |
百度视频 6.2.2.ipa | 1 | 3 |
高德导航 9.2.ipa | 1 | 0 |
优酷 4.3.ipa | 2 | 3 |
网易云音乐 2.3.1.ipa | 2 | 0 |
滴滴打车 3.6.2.ipa | 3 | 0 |
网易新闻 416.ipa | 4 | 1 |
QQ 5.4.ipa | 9 | 2 |
猿题库 4.1.0.ipa | 9 | 0 |
京东 .ipa | 10 | 0 |
搜狐视频 4.6.3.ipa | 10 | 0 |
快的打车 3.7.ipa | 11 | 0 |
小猿搜题 1.4.0.ipa | 12 | 0 |
WeChat 6.1.1.ipa | 13 | 20 |
Evernote 7.6.5.ipa | 23 | 25 |
有道云笔记 4.3.1.ipa | 40 | 11 |
来往 4.3.2.ipa | 48 | 0 |
百度地图 7.6.1.ipa | 76 | 227 |
易到用车 6.2.2.ipa | 106 | 0 |
网易有道词典 5.2.2.ipa | 114 | 9 |
美图秀秀 3.5.0.ipa | 155 | 3 |
支付宝钱包 8.5.3.ipa | 158 | 7 |
手机淘宝 5.2.4.ipa | 188 | 0 |
易信 1.4.8.ipa | 292 | 12 |
大众点评 7.0.2.ipa | 1783 | 5 |
iMovie 211.ipa | 4323 | 1 |
以上这个表格说明了即使是比较著名的 App,在使用 xib/storyboard 上,也有很大的差异。举几个例子:
QQ、WeChat(微信)和易信同属于社交类应用,而且按理说,由于用户量和开发时间更长,QQ 和微信应该比易信更加复杂,但是从 xib 数量上,前者 xib 的数量都非常少。这说明,在 QQ 和微信中,很多界面肯定是通过手写代码来完成的。
滴滴打车、快的打车和易到用车同属于叫车软件,按理说滴滴打车、快的打车同时包含叫出租车和叫专车功能,应该比易到用车功能更多,更复杂。但是前者 xib 的数量都非常少。这也说明,滴滴打车、快的打车的界面很多是通过手写代码来完成的。
另外,像 Mailbox、播客 (Podcast)、Twitter、objcio 这些 App 中 xib 的数量为 0,说明其完全是用手写代码来完成 UI 界面编写的。
当然,也有一些能看出来几乎是由 xib 构成的应用,例如大众点评、美图秀秀、网易有道词典。而苹果的 iMovie 使用了 4000 多个 xib,真让人不敢相信。我后来仔细看了一下,原来是因为 iMovie 做了国际化,每种语言大概有 120 个 xib,因为支持了将近 40 个语言,所以 xib 数量变成了 4000 多个。大众点评的每个 xib 也被切分成了 4 个,具体用处我还没研究,如下是一个示例:
就上面的调研我们就可以看出,其实大家对于是否应该使用 xib 做界面是有争议的。在实际案例中:
那么我就从我的角度把用与不用 xib 的优缺点表达一下。
View Controller
的界面间的调用关系。这一点对于新加入项目组的开发同事来说,比较友好。 Table View Controller
的 Static Cell 功能。对于开发一些 Cell 不多,但每个 Cell 都不一样的列表类设置界面会比较方便。 – (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
方法,每个 View Controller 的跳转逻辑都聚集在一处,这方便我们统一管理界面跳转和传递数据。 所以我更喜欢用代码编写 UI 界面,加上现在移动开发对于 App 要求的需求越来越强烈,很多复杂的交互效果需要在代码中编写,这种情况下 xib 能提供的帮助越来越有限。
但是 xib 提供的 “所见即所得” 这种优势还是巨大的,如果我们是手写界面,那么调试起来是非常痛苦的。在这一里,我给大家推荐购买 Reveal 这个界面调试工具,Reveal 可以在 App 运行时动态地修改界面元素的参数,这样我们就可以一次性在代码中把界面元素的字体、颜色、位置这些参数在 Reveal 调试好,避免多次重启运行来调试界面。我在我的 《iOS 开发进阶》 书里,也花了一整章来介绍 Reveal 的使用。如下是书中的一个 Reveal 运行时截图:
其实,你完全不需要做一个 “艰难的决定”,你可以像 QQ 和微信那样,根据具体情况来选择性的使用 xib 和 storyboard。这里有我的一些建议:
对于很多新手来说,他们接触到的都是使用 Interface Builder 来构造界面。希望本文让大家了解到 xib 和 storyboard 在开发中的争议,手写界面并不是一个小众的行为并且有很多好处,希望每一个人都能掌握它,并且在需要的时候根据具体情况来决定是否采用。
愿大家玩得开心~