iOS 开发技术选型之搭建 UI:代码手写 vs. Xib vs. Storyboard

在开发一个 iOS 应用之前,我们一定会问这样一个问题:我应该用哪种方式搭建界面呢,代码手写,Xib 还是 Storyboard。当我们手握好几个工具的时候,很容易犯选择困难症。即使是一个合作默契的团队,成员们也难免有不同的偏好,难以形成一致的结论。所以我们有必要去探索每个工具的优缺点和各自最适合的场景,以期得出一些最佳实践,提高开发效率和应用质量。

代码手写

有一类程序员特别喜欢用代码控制一切。他们觉得既然 Xibs 和 Storyboards 能做和不能做的都能通过代码手写完成,那为什么还要多依赖一个工具呢。直接代码手写不是更专注更高效吗。还好我不属于这类狂热分子,所以我能更客观地看待。

优点

  • 开发者能更好的理解背后发生了什么,也拥有更多的控制权,所以 Xibs 和 Storyboard 完不成的通过代码一定能完成。
  • 多人合作时在版本控制上的优势,即使发生了合并冲突,因为是纯代码,所以更易于手动解决。也便于追踪改动。
  • 有很好的重用性。有时候需要封装一些控件在项目里多处使用或提供给其它开发者使用,用代码手写是最好的方式,同时也便于后续的修改。

缺点

  • 速度慢,效率低。代码手写意味着所有的初始化设置都需要自己写,势必花费更多时间。另外由于无法可视化地为 UI 元素布局,在开发过程中也会浪费很多时间在调试上。
  • 增加了维护难度。也许过了一段时间再看所写的代码或是新来的成员要读代码,都有可能被那些诡异的数字给弄懵的。

Xibs

在我刚开始学习 iOS 开发的时候,还好有 Xib 可以选择。通过拖拽就能将各种控件摆放在正确的位置,在触摸板上点点就能设置各种属性,这种可视化的方式无疑让我很有兴趣继续学习去。但和代码手写一样,各有优缺点。

优点

  • 可视化,包括添加控件和设置属性,配置 IBOutlet 和 IBAction,支持 Autolayout,支持 Size classes。因此能够快速搭建界面,减少代码,省下大量开发和调试的时间。也使得 ViewController 可以更少地关注搭建 UI 的事。
  • 重用性。通常是一个 Xib 文件对应一个 ViewController,如果多个 ViewController 用到相同的元素组合,那我们就可以把这部分提出来放到专门的 Xib 文件里,用一个自定义的 View 去管理它们。比如会被重用的自定义的 TableViewCell 也会这么处理。

缺点

  • 多人协作时版本控制上的劣势,合并冲突时不易处理。虽然在 Xcode5 之后 Apple 优化了 xib 文件的格式,变得更易读易追踪,但还是不如纯代码那么容易处理。
  • 无法完成一些更复杂的,动态的布局。通常需要在 xib 中先设置好 Autolayout 约束,再在代码中做一些动态的处理。
  • Xib 中属性设置可以被覆盖,导致在后期维护中面对一些诡异的界面问题时却无法快速的找出原因。这点需要我们在开发过程中约定好尽量不要在代码中修改属性。

Storyboards

Apple 从 Xcode5 开始将 Storyboard 作为新建项目的默认配置,可见它强力推广 Storyboard 的决心。Storyboard 顾名思义,重点在于将多个场景关联起来展示一个连贯的故事。在 Xcode 里,可以看成把一组 ViewController 对应的 Xib 文件放到一个文件中,并配置好它们之间的转场方式。所以 Storyboard 和 Xib 的优缺点会有重合。

优点

  • 可视化,除了前面 Xib 那段中提到的快速搭建界面意外,Storyboard 还增加了各个 ViewController 之间的转场关系,使得开发者尤其是新加入的开发者能更容易更清晰的整理整个应用的流程和交互。基于这一点我们甚至还可以不写代码直接拿来做简单的原型设计。
  • 支持在 TableView 中直接添加 Cell,包括动态和静态两种类型。当一个 TableView 有很多不同样式的 Cell, 或者是固定的 Section 和 Cell 的时候,这个特性会提供很大的便利。

缺点

  • 文件大,加载慢。一般情况下很容易会把所有的 ViewController 放在同一个 Storyboard 里,导致文件很大,打开的时候需要加载几十秒。可尝试拆分 Storyboard 缓解这个症状。
  • 多人协作时容易产生合并冲突。一方面多个成员可能对同一个 Storyboard 进行修改,另一个方面 Xcode 在打开文件的时候可能会根据版本自动做一些修改,这些都给合并代码制造了麻烦。可通过拆分 Storyboard 达到每个成员只负责其中一个
  • 不能单独存在自定义的 View。因为 Storyboard 更强调 ViewController 之间的关系,也就是整体的流程,所以不允许单个 View 的存在。这也是 Xib 文件该跳出承担责任的时候了。
  • 触发 Segue 和数据传递的分裂。有时候我们需要在 ViewController 之间传递数据,但是如果用常规的 Storyboard 的流程的话需要先通过 performSegueWithIdentifier:sender: 触发然后再在 prepareForSegue:sender: 方法中获得目标 ViewController 再对其属性进行赋值。使得本应该连贯的过程被分裂了。

总结

在了解了每种方式的优缺点后,我们才可以根据不同的应用场景选择更合适的方法。在这个问题中,这几个选项不是排他的,而是可以相互合作来提升开发效率和应用质量。

总体来说可以根据应用的规模来决策:

  • 小型:请毫不犹豫地使用 Storyboard 吧。可视化,速度快。把所有界面都放在一起,让人有一种君临天下的感觉。
  • 中型:主体用 Storyboard,一些需要重用的 View 用单独的 Xib,比如 TableViewCell。
  • 大型:将应用分成不同的模块,每一个模块用一个单独的 Storyboard。比如基于 UITabBarViewController 的应用可以按照 Tab 来分成若干个 Storyboard。Apple 还在 iOS 9 引入了 Storyboard references 帮助开发者重构以获得更好的模块化。

另外,代码手写的方法也不是没有用用武之地,那些布局复杂,动态性高的 View 更适合通过代码来搭建。

最后再说一句,随着现代 IDE 的发展,越来越多的底层实现细节被隐藏起来,但作为开发者,我们还是有必要去探索背后的真理,才能更从容地面对各种意料之外的问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,345评论 7 249
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,068评论 4 62
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,136评论 30 470
  • 2017年1月13日 晴 给我一场雨 淋透纱衣 所有蒙蒙细语 太多余地 一把伞遮住了焦急 可惜 两个字定了规矩 无...
    鲜栗子阅读 242评论 1 1
  • 最近为了一个影片,功课还有论文忙的团团转。还有自己心里的情绪要顾。我会顾别人的心情而让自己配合着别人,但是别人并不...
    sunlightying123阅读 190评论 0 1