StoryBoard是iOS 5的新特征,旨在代替历史悠久的NIB/XIB(其实StoryBoard仍是基于NIB/XIB的,不过开发人员已经无需直接跟NIB打交道了)。目前关于StoryBoard的文档并很少,苹果的iOS 5的开发者文档里也仅有很少的介绍。因此,本文只是简单的谈谈本人对StoryBoard的一些粗浅的理解。(StoryBoard有时也叫作StoryBoarding,我不太注意这种细节,因此两个词常常会混用,若是你英语能够的话,能体会到二者的细微差异)html
StoryBoarding机制比之NIB/XIB的的优点何在呢?我的认为,StoryBoard有如下几个优势:设计模式
可以减小不少跟View相关的代码;app
可以使View和Controller进一步解耦;ide
可以优化程序的“页面流”,使程序的结构更清楚 ;优化
要理解这些优势,咱们先要对NIB有一个基本的认识。一般,NIB是和ViewController相关联的,不少ViewController都有对应的NIB文件。NIB文件的做用是描述用户界面以及初始化对象和界面元素对象。其实开发者在NIB里描述的界面和初始化的对象都可以在代码中实现;之因此用Interface Builder来绘制界面,是为了减小那些设置界面属性的无聊和重复的代码,让开发人员可以集中精力作程序的功能。ui
而StoryBoard的出现,则是进一步增强了这方面的功能;NIB文件是没有办法描述从一个ViewController到另外一个ViewController的过渡的。这种过渡只能靠手写代码来实现。相信不少人都会常常用到
要用好Storyboarding机制,那么必须严格遵照MVC原则。要让View和Controller充分解耦;而且不一样的Controller之间也要充分解耦。不然,程序的业务逻辑就会乱成一团,很难理解,维护和除虫(Debug)。spa
举个例子来讲:在过去,特别是初学Cocoa Touch开发的时候,不少人都喜欢直接把AppDelegate当ViewController用,直接在AppDelegate和MainMenu.xib之间交互。应该说,这是一个很是很差的习惯。AppDelegate的做用很简单,就是处理UIApplication的回调,而不该该负责用户界面的处理。不少iOS教程为了省事,都直接把AppDelegate当ViewController用,甚至直接举例在UIWindow上绘制界面。虽然,做为教程这么作很简单明了,由于UIWindow也是UIView的子类,可是这却不是一种优良的实践。由于由ViewController来负责处理View才是正确的作法。设计
近一段时间,苹果的项目模版常常发生改变,特别是自从Xcode 4发布以后,程序模版(如,View Based Application)开始鼓励使用UIWindow的rootViewController属性来指定第一屏的ViewController,以保证AppDelegate专一于它应该作的事情。而引入StoryBoard以后,AppDelegate已经无论ViewController的事情了 ;第一屏所使用的ViewController(也就是rootViewController)能够在StoryBoard中设置。这样,程序的入口点就能从StoryBoard的“设计图”上一目了然了。这是第二个优势。3d
至于第三个优势,就是StoryBoard的“设计图”了。StoryBoard可以包含一个程序全部的ViewController以及它们之间的链接。所以,StoryBoard甚至能够做为程序的“设计图”来用了。理想状况下,在程序开发接近尾声的时候,咱们只需对比StoryBoard的“流程”和最初程序的设计“流程”,就知道程序有没有“走样”了。
说完了优势,咱们来看看从NIB/XIB到StoryBoard的迁移,咱们须要有哪些理解和实践上的改变呢?
首先,天然是(在作程序开发的时候)ViewController再也不须要NIB/XIB了(虽然在后台仍是用的NIB)。之前在NIB/XIB上作的链接Outlet和Action的操做均可以在StoryBoard上完成了;
第二,孤儿View(独立于ViewController的View)是不能出如今StoryBoard里的,View必须经过ViewController来管理(StoryBoard更像是Controller对象的容器,而不是View对象的容器,NIB/XIB能够做为View对象的容器);
第三,ViewController之间的过渡代码已是历史了,用StoryBoard能够直接可视化地链接不一样的ViewController;
第四,UIWindow对象的做用被进一步淡化,甚至能够这么说:其实不少程序根本无需用到UIWindow对象。AppDelegate也再也不被鼓励(也不能)用来作ViewController--你甚至没法在Interface Builder的StoryBoard图上找到AppDelegate对象--由于它原本就不该该用来处理界面(View)的。
最后,写优质的代码,严格遵照MVC设计模式,这样不只可以让你用好StoryBoard,也能帮助你理解StoryBoard的原理。
StoryBoard是很是好的鼓励MVC和代码解耦的手段,可以让开发人员写出更加容易维护的代码。不过对于初学者来讲,确实是个对理解力的小挑战。不过做为初学者也不用担忧,一旦突破了理解障碍,你就会发现StoryBoard也很是好用--就像最初理解NIB/XIB时,Outlet和Action“拉线”来“拉线”去,看起来也很神奇;理解以后,发现原来“拉线”神马的也没那么神秘。
好了,絮絮不休的啰嗦了这么多无聊的文字,相信你也看累了。若是你依然对我写的东西不知所云的话,你能够稍稍研究一下Xcode 4.2的几个内建模版,而后和使用XIB的模版对比一下,看看苹果是怎么用StoryBoard的,可以很好的帮助你理解Storyboarding机制。固然,千万不要忘记亲自动手用一用StoryBoard!
Happy Coding!