使用 xib 和 storyboard以及手写代码的取舍
来源:互联网 发布:芒果tv网络电视 编辑:程序博客网 时间:2024/05/22 00:45
使用 xib 和 storyboard 的优点
开发界面所见即所得,可以快速通过拖拽构造界面。
你可以从 storyboard 中很方便地梳理出所有View Controller的界面间的调用关系。这一点对于新加入项目组的开发同事来说,比较友好。
使用 Storyboard 可以使用Table View Controller的 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 的性能会比较差。
总结
其实,你完全不需要做一个 “艰难的决定”,你可以像 QQ 和微信那样,根据具体情况来选择性的使用 xib 和 storyboard。这里有我的一些建议:
对于复杂的、动态生成的界面,建议使用手工编写界面。
对于需要统一风格的按钮或UI控件,建议使用手工用代码来构造。方便之后的修改和复用。
对于需要有继承或组合关系的 UIView 类或 UIViewController 类,建议用代码手工编写界面。
对于那些简单的、静态的、非核心功能界面,可以考虑使用 xib 或 storyboard 来完成。
对于很多新手来说,他们接触到的都是使用 Interface Builder 来构造界面。希望本文让大家了解到 xib 和 storyboard 在开发中的争议,手写界面并不是一个小众的行为并且有很多好处,希望每一个人都能掌握它,并且在需要的时候根据具体情况来决定是否采用。
- 使用 xib 和 storyboard以及手写代码的取舍
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- Communications link failure Last packet sent to the server was 0 ms ago.问题解决
- BZOJ1044
- 社説 20150819 天津爆発事故 中国は情報開示を前向きに
- Facebook的CIO都做些什么?
- TortoiseSVN文件夹及文件图标不显示解决方法
- 使用 xib 和 storyboard以及手写代码的取舍
- MYSQL事务处理
- Human Gene Functions
- Linux 进程管理
- Qt5.2连接SQLServer2008
- Unity3D游戏开发之游戏读/存档功能在Unity3D中的实现
- codeforces 568A A. Primes or Palindromes?(打表+暴力枚举)
- 【JS/网易公开课】哈佛大学公开课:构建动态网站 第6讲 JavaScript
- 使用两个栈模拟队列的操作