iOS杂谈-我为什么不用Interface builder
在互联网上关于Interface Builder的争吵每天都在发生,用和不用大家都有一大堆的理由。最近看了这篇文章,很多地方和作者有共鸣,结合自己的一些经历,就有了你现在所看到的东西,你可以把它当成前者的中文版。
一年前我开始做iOS开发,看的是Stanford的CS 193P。老头子推荐新手用Storyboard来做开发,因为它是可视化的,不太需要了解代码层的东西就能拖出界面,各种配置项可以通过勾选搞定,省去很多代码,相当傻瓜,此外Storyboard也让人对应用程序的活动流程一目了然。我对这种拖拽式的编程方式很不习惯:这不是代码出奇迹的节奏啊!
我开始做实际的项目。看了几个开源项目的代码后,我知道旧时代有个xib格式的文件。这货是Interface Builder的产物,现在我们称他们为NIB。用法和Storyboard差不多,可视化拖拽、配置。Storyboard比较新,业界用的人不多,于是我很纠结,到底是听老头子的话用新东西,还是随大流试试单独的NIB?初生牛犊不怕虎,反正没怎么做过iOS开发,就按课上说的来吧,我们团队用Storyboard拖UI。一个月后,我提议弃用Interface Builder,不用任何NIB(包括Storyboard)。直到现在只要是在我控制范围内,我都没再碰过任何NIB,我更愿意用代码来生成。
不用Interface Builder的理由很多,对我来说主要有一下几点:
多人协作
从项目管理的角度来讲NIB就不应该被使用。你能保证自己从来不会在合并NIB时出现冲突吗?在一个稍有规模,多开发者的项目里,合并NIB简直就是梦魇。特别是多人共用一个Storyboard时,开发者将花费很多时间和精力去解决冲突,而不是去做比这更有意义的事。
当然,如果最终合并结果正确可信,那么很多同学还是可以忍受的。然而,合并毕竟是会出问题的,尤其是用Git自动合并。这些问题直到运行时才会出现!倘使测试力度不够,这就是潜在的隐患。此外,我们知道NIB是人不可读的,也就是说,对它做版本控制几乎没有意义。你没法从diff看出来半点名堂。倘使你使用的不是NIB,而是一行一行的Objective-C代码,那么结果会好很多。
选择显式而非隐式
我喜欢用代码来完成各种东西,这样你打开一个view或者一个view controller,就能看到所有东西。否则,看你代码的这位同学还得去找相应的NIB。
NIB同样也是滋生bug的温床,很多时候你调试了半天才发现,某个bug并不是出在自己的代码里,而是在Interface Builder的某个小角落里自己忘记给某个选项打上√。如果所有的组件都由代码生成,那么在调试时就简单得多,你只要专注于和View有关的代码就快好了。选择显式地在代码里写view,可以让你对view有强大的控制力。从初始化到布局、绘制你都能插手,在代码里你清楚地知道某个view的各个属性会是多少,而非交由Interface Builder来管理,这样虽然看上去代码行数多了,但它帮你减少了bug数量,节省了debug时间。
耦合
用Interface Builder去创建可复用的view会是一件很蛋疼的事。首先你需要拖拽出各种各样的组件,然后给每个组件设置属性,接着你要把outlet连接到要用到的代码块……某一次,你忘记连outlet,然后你的程序就在runtime crash了。看,你又弄出了一堆bug。对于各种零碎的view我更喜欢为他们写类,然后在里面实现各种我想要的东西,在需要用到这些view的时候生成对象就是了。如果我有什么错误,编译器大哥还能帮我检查。
使用NIB让我提心吊胆,它让程序变得不那么紧凑。很多需要内聚的东西,被分了出去。从实际的开发体验来讲就是东一块,西一块,切来切去我都觉得烦。一旦当你定制的view越来越多,NIB就增多,然后呵呵。
布局
我承认自己几乎没在Interface Builder用过各种layout(包括auto-layout)。我不清楚用NIB做layout是否困难。但我知道重写UIView的layoutSubviews让布局变得很简单。所有子元素的布局只要在这里设置就行了。需要重新布局时,调一下setNeedsLayout就行。不用关心什么Interface Builder里各种layout概念,不用把布局代码分地方写(降低耦合)。只要稍加判断,让同一个view适应iPhone和iPad不是什么难事。给iPad和iPhone分别提供NIB这种事简直不能忍。
本地化
当IB遇到本地化会发生什么呢?我屮艸芔茻!只要涉及本地化的NIB,都要你去投时间和体力做啊。点鼠标啊,设置啊,纯体力活!如果用代码,字符串用NSLocalizedString(@"Localizable String", @"Comment"),然后在资源文件里翻译一下,轻轻松松。
小结
Interface Builder的初衷可能是希望帮助开发者节省写界面的时间和精力。可视化,表现层和数据分离都是很好的思想。但它在目前还不让人满意。它让多人协作变得困难,诱导拙劣的实践,降低可复用性,让你开发变慢……
我如果能不用IB,就不用,作为一名程序员更应该用代码说话。从装逼角度来讲,这样才显得高端大气上档次不是吗?
转:http://blog.xianqu.org/2013/06/why-i-dont-use-interface-builder/
iOS杂谈-我为什么不用Interface builder的更多相关文章
- iOS开发工具Xcode:Interface Builder
简介: Interface Builder(IB)是Mac OS X平台下用于设计和测试用户界面(GUI)的应用程序(非开源).为了生成GUI,IB并不是必需的,实际上Mac OS X下所有的用户界面 ...
- iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
http://blog.csdn.net/pucker/article/details/41843511 上一篇文章<iOS 8界面自动布局系列-1>简要介绍了iOS界面布局方式的前世今生 ...
- 【转 iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
原文网址:http://blog.csdn.net/pucker/article/details/41843511 上一篇文章<iOS 8界面自动布局系列-1>简要介绍了iOS界面布局方式 ...
- IOS 使用Interface Builder开发界面入门与技巧
引言: 通过Interface Builder(简称IB)来制作界面一直是iOS开发界饱受争议的方式.主要争议的话题是不太适合团队协作开发,再就是对IB的使用比较生疏,觉得IB只能完成一些很简单的功能 ...
- iOS开发-Interface Builder的前世今生
Interface Builder,是用于苹果公司Mac OS X操作系统的软件开发程序,Xcode套件的一部分,于1988年创立.它的创造者Jean-Marie Hullot自称是“一个热爱旅行.充 ...
- Interface Builder: What are the UIView's Layout iOS 6/7 Deltas for?
up vote57down votefavorite 19 I just noticed the iOS 6/7 Delta property found under the UIView's str ...
- iOS开发~interface Builder(简称 IB) 界面构建器
1.interface Builder 设置界面 1.1 是什么? 一个可视化的界面编辑工具软件,在xcode4之后整合到了xcode中 1.2 作用? 通过可视化的界面设置,能够少写或不写代码而完成 ...
- iOS学习笔记(1)--认识Xcode6.1的Interface Builder和常用快捷键
Interface Builder基本界面 红色区域为工具栏(Tool Bar) 蓝色区域为导航区(Navigator Area) 绿色区域为编辑区(Editor Area) 黑色区域是调试区(Deb ...
- 【iOS】Interface Builder 预览
Interface Builder 为最顶层视图提供了 Simulated Metrics,预览用户界面的各种外观设置效果,例如顶部有导航栏或底部有标签栏的效果,如图所示:
随机推荐
- 数据库知识整理<八>
联接: 8.1理解简单的单联接: 基本上联接的结果是每个集合的笛卡尔积.例如:两个集合{a,b,c}和{a,b}的笛卡尔积是如下的成对集合:{(a,a),(a,b),(b,a),(b,b),(c,a) ...
- 备份数据库的时候设置 BufferCount 选项不正确导致 out of memory 的情况
备份数据库的时候设置 BufferCount 选项不正确导致 out of memory 的情况 今天群里面的东辉兄跟我说备份生产数据库的时候报错 环境: 32位的SQLSERVER2008 机器有1 ...
- SQLSERVER 数据库性能的的基本
SQLSERVER 数据库性能的基本 很久没有写文章了,在系统正式上线之前,DBA一般都要测试一下服务器的性能 比如你有很多的服务器,有些做web服务器,有些做缓存服务器,有些做文件服务器,有些做数据 ...
- 配置Windows 2008 R2 64位 Odoo 8.0 源码PyCharm开发调试环境
安装过程中,需要互联网连接下载python依赖库: 1.安装: Windows Server 2008 R2 x64标准版 2.安装: Python 2.7.10 amd64 到C:\Python27 ...
- Failed to initialize the Common Language Runtime
今天在SQL Server 2008中执行存储过程的时候报以下错误: Msg , Level , State , Procedure usp_QueryRealTimeRoomInfo, Line F ...
- 自旋锁-SpinLock(.NET 4.0+)
短时间锁定的情况下,自旋锁(spinlock)更快.(因为自旋锁本质上不会让线程休眠,而是一直循环尝试对资源访问,直到可用.所以自旋锁线程被阻塞时,不进行线程上下文切换,而是空转等待.对于多核CPU而 ...
- java开发常用jar包介绍(转载)
jta.jar 标准JTA API必要 commons-collections.jar 集合类 必要 antlr.jar ANother Tool for Language Recognition ...
- Linux kernel develop -- Hello World
hello.c: #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h&g ...
- APU平台DirectX 12性能测试:超级大惊喜!
APU平台DirectX 12性能测试:超级大惊喜! 转自:http://www.ithome.com/html/digi/129840.htm [size=1pc]微软将会在接下来的GDC 2015 ...
- atitit.导航的实现最佳实践and声明式编程
atitit.导航的实现最佳实践and声明式编程 1. 顶部水平栏导航 1 2. 竖直/侧边栏导航 1 3. 选项卡导航 1 4. 面包屑导航 1 5. 标签导航 1 6. 搜索导航 2 7. 分面/ ...