使用 xib 和 storyboard 的优点
- 开发界面所见即所得,可以快速通过拖拽构造界面。
- 你可以从 storyboard 中很方便地梳理出所有
ViewController
的界面间的调用关系。这一点对于新加入项目组的开发同事来说,比较友好。 - 使用 Storyboard 可以使用
TableViewController
的 Static Cell 功能。对于开发一些 Cell 不多,但每个 Cell 都不一样的列表类设置界面会比较方便。 - 通过实现
– (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
方法,每个 View Controller 的跳转逻辑都聚集在一处,这方便我们统一管理界面跳转和传递数据。 - Storyboard 可以方便将一些常用功能模块化和复用。例如 WWDC2011 年介绍 Storyboard 的视频就将微博分享功能模块化成一个单独的 Storyboard。
使用 xib 和 storyboard 的缺点
- xib 对版本管理是灾难。storyboard 实际上的多个 xib 的集合,所以更容易让多人编辑产生冲突。而虽然它们是 xml 格式,但是冲突解决起来还是不如代码那么容易。
- 苹果对 xib, storyboard 的设计中带有当前电脑的操作系统版本和 Xcode 版本。所以如果两个协作的开发者电脑操作系统或 Xcode 有不一样的话,每次打开必定会修改这个文件。另外即使操作系统版本和 Xcode 版本一样,有些时候打开看也会造成一些自动的修改。
- storyboard 带来的 segue 的概念对于开发来说并不省事,特别是在需要传递参数的时候。如果是用程序内部 trigger 一个 segue,那么需要在另一个回调的地方设置 dest view controller 的参数信息。
- 我们发现 xib 中设置的颜色值并不精确,RGB 在真机 / 模拟器上常常会有 10 多像素的偏差。
- xib 和 storyboard 对继承的支持并不友好。无法做界面的继承。
- xib 和 storyboard 对搜索支持并不友好,无法方便地在 Xcode 中查找关键词(但是可以通过写 bash 命令来查找)。
- storyboard 对组合支持得不太好,不允许在一个 xib 中附带多个子 view。
- xib 和 storyboard 不太方便做界面的模块化管理,比如我们想统一修改界面中所有按钮的字体样式,那么在 xib 和 storyboard 只能一个一个手工修改,而如果是代码编写的,则只需要改一个工厂方法的实现即可。
- 对于复杂的 App,storyboard 的性能会比较差。
关于手写 UI 界面的一些挑战
现在移动开发对于 App 要求的需求越来越强烈,很多复杂的交互效果需要在代码中编写,这种情况下 xib 能提供的帮助越来越有限。但是 xib 提供的 “所见即所得” 这种优势还是巨大的,如果我们是手写界面,那么调试起来是非常痛苦的。
总结
根据具体情况来选择性的使用 xib 和 storyboard。这里有我的一些建议:
- 对于复杂的、动态生成的界面,建议使用手工编写界面。
- 对于需要统一风格的按钮或UI控件,建议使用手工用代码来构造。方便之后的修改和复用。
- 对于需要有继承或组合关系的 UIView 类或 UIViewController 类,建议用代码手工编写界面。
- 对于那些简单的、静态的、非核心功能界面,可以考虑使用 xib 或 storyboard 来完成。
对于很多新手来说,他们接触到的都是使用 Interface Builder 来构造界面。希望本文让大家了解到 xib 和 storyboard 在开发中的争议,手写界面并不是一个小众的行为并且有很多好处,希望每一个人都能掌握它,并且在需要的时候根据具体情况来决定是否采用。