浅谈iOS 5的StoryBoard
转自:http://blog.163.com/wangy_0223/blog/static/450146612012318113233218/
StoryBoard是iOS 5的新特征,旨在代替历史悠久的NIB/XIB(其实StoryBoard还是基于NIB/XIB的, 不过开发人员已经无需直接跟NIB打交道了)。目前关于StoryBoard的文档并不多,苹果的iOS 5的开发者文档里也仅有不多的介绍。所以,本文只是简单的谈谈本人对StoryBoard的一些粗浅的理解。(StoryBoard有时也叫做 StoryBoarding,我不太注意这种细节,所以两个词经常会混用,如果你英语可以的话,能体会到两者的细微差别)
StoryBoarding机制比之NIB/XIB的的优势何在呢?个人认为,StoryBoard有以下几个优点:
- 能够减少很多跟View相关的代码;
- 能够使View和Controller进一步解耦;
- 能够优化程序的“页面流”,使程序的结构更清楚 ;
要理解这些优点,我们先要对NIB有一个基本的认识。通常,NIB是和ViewController相关联的,很多ViewController都 有对应的NIB文件。NIB文件的作用是描述用户界面以及初始化对象和界面元素对象。其实开发者在NIB里描述的界面和初始化的对象都能够在代码中实现; 之所以用Interface Builder来绘制界面,是为了减少那些设置界面属性的无聊和重复的代码,让开发人员能够集中精力做程序的功能。
而StoryBoard的出现,则是进一步加强了这方面的功能;NIB文件是没有办法描述从一个ViewController到另一个ViewController的过渡的。这种过渡只能靠手写代码来实现。相信很多人都会经常用到 -presentModalViewController:animated:
以及-pushViewController:animated:
这 两个方法。这种代码在Storyboarding里将成为历史;取而代之的是Segue。Segue定义了从一个ViewController到另一个 ViewController的过渡。在Storyboard里,我们只需要像连接界面对象和Action Method那样把ViewController之间用Segue连接起来就可以了,不再需要手写代码了。即便你像自定义Segue,你也只需写 Segue的实现,而无需编写调用的代码,StoryBoard会帮你调用的。这就是上面所说的第一个优点。
要用好Storyboarding机制,那么必须严格遵守MVC原则。要让View和Controller充分解耦;并且不同的Controller之间也要充分解耦。否则,程序的业务逻辑就会乱成一团,很难理解,维护和除虫(Debug)。
举个例子来说:在过去,特别是初学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的“设计图”上一目了然了。这是第二个优点。
至于第三个优点,就是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!
【更新】
在看了WWDC 2011 的session video:UIViewController Containment这个视频之后,我感觉,正确的处理UIViewController
之间的层级关系对于Storyboard来说非常重要,两者能够相得益彰。而window.rootViewController
的使用,虽然也是鼓励用户不要把AppDelegate
当ViewController
用,更重要的是鼓励用户使用正确的UIViewController
层级关系。
(全文完)
浅谈iOS 5的StoryBoard的更多相关文章
- 浅谈iOS视频开发
浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我们从 ...
- 浅谈iOS中的userAgent
浅谈iOS中的userAgent User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...
- 浅谈iOS多线程
浅谈iOS多线程 首先,先看看进程和线程的概念. 图1.1 这一块不难理解,重点点下他们的几个重要区别: 1,地址空间和资源:进程可以申请和拥有系统资源,线程不行.资源进程间相互独立,同一进程的各线程 ...
- 浅谈iOS中MVVM的架构设计与团队协作
说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...
- IOS中 浅谈iOS中MVVM的架构设计与团队协作
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈iOS中MVVM的架构设计与团队协作【转载】
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈 iOS 与 H5 的交互- JavaScriptCore 框架
前言 小的作为一个iOS程序猿,可能研究JavaScript以及H5相关的知识并不是为了真正的要去转行做这一方面,其实更多的为了要研究OC中的JavaScriptCore框架,JavaScriptCo ...
- 浅谈iOS需要掌握的技术点
鉴于很多人的简历中的技术点体现(很多朋友问我iOS需要知道注意哪些)! 技术点: 1.热更新 (及时解决线上问题) 2.runtime(json解析.数据越界.扩大button点击事件.拦截系统方法) ...
- 浅谈iOS的Autolayout
iOS 应用,通常是以界面(UI: User Interface)展示给用户. 没有界面的应用,对用户来说,将无所适从,总不至于罗列出一堆说明书吧. iOS开发,很大一部分工作量都花在界面布局上,有时 ...
随机推荐
- JAVA项目如何打开,打开乱码怎么办,字体太小怎么办,感叹号是什么情况
打开java项目 Finish 汉字乱码改这里 字体大小改在第一个的 Appearance里面 项目前面有感叹号,都是tomcat和jdk配置有问题
- H5 manifest离线缓存
请跳转我的有道云笔记查看: http://note.youdao.com/noteshare?id=caaf067c6e38820ba8f87b212c2327a9&sub=23E0F8F7A ...
- 关于Java设计模式的一些概况
设计模式(Design pattern)在软件行业一直都扮演着很重要的角色.最近感觉自己对设计模式的知识有些遗忘了,虽然以前也看了很多,但是坦白说,其实并没有怎么理解.基本还是为了应付面试.然后,在工 ...
- asp.net membership 修改密码
aspnet_Applications 存储数据库所涉及应用程序有关信息. aspnet_Membership 存储与用户相关信息例如:用户登陆密码,创建时间. aspnet_Paths 存储应用程序 ...
- [转载]Delphi事件的广播
https://blog.csdn.net/dropme/article/details/975736 明天就是五一节了,辛苦了好几个月,借此机会应该尽情放松一番.可是想到Blog好久没有写文章,似乎 ...
- 【转载】C/C++语言分析 & 每年学一种编程语言 & git历史
http://blog.csdn.net/turingbook/article/details/1778867 <程序员修炼之路>英文注释版 作者提出的经营之道是:——Invest Reg ...
- XSS之浪潮已经来临
前些天和Roy厉在微博上聊到微信公众账号,我说我在辛苦运营“网站安全中心”这个账号呢,他说我这账号粉丝少是少了点,不过用户定位精确,我说我不希望精确,因为我在尽可能写科普,科普需要传播. Roy厉说过 ...
- Axios使用文档总结
vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios.Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 一.安装 ...
- 《深入理解Java虚拟机》笔记6
class文件由无符号数和表两种类型数据构成.表其实相当于一种结构体,内部又嵌套无符号数或者表. 用u1,u2,u4,u8分别代表一个字节,两个字节,四个字节,八个字节的无符号数. 如图中所示,cla ...
- nginx 相关命令 nginx -s reload/stop/quit
nginx 相关命令 学习了:https://www.cnblogs.com/zoro-zero/p/6590503.html start nginx 或者在linux上面直接 nginx ngin ...