代码改变世界

Xcode4.2开发入门之一些变化(二)

2011-11-26 21:17  张智清  阅读(4774)  评论(0编辑  收藏  举报

3. 新增特性——Storyboard
Storyboard是Xcode4.2新增的又一个特性,它将原有工程中的所有xib文件集成在一起,用拖曳的方式建立ViewController相关之间的跳转关系,使得整个程序的UI跳转逻辑清楚明了。简单地说,storyboard引入了2个概念:

scene:一个场景,由一个viewController和相关的xib表示。

segue:(英文原意为继续、持续)。在这是用于连接scenes,其有多种类型,包括:Push,Modal,Popover and more。

当然segue也负责传递数据和返回数据。

整个程序的界面转换就是在各个scene之间切换。界面跳转关系,比如按哪个键跳到哪个界面,是由segue来描述。segue也可以带数据,以便做数据传递。(也因此被说是抄袭Adobe的Flash)。

要点:必须有一个viewController是作为storyboard的初始界面的,及需要勾选上Initial Scene项。如下图:

 

StoryBoard相对于以前的NIB/XIB的优势:

  • 能够减少很多与View相关的代码量。
  • 能够使View和Controller进一步解耦。
  • 能够优化程序的“页面流”,使程序的结构更清楚。

      通常,NIB是和ViewController相关联的,很多时候ViewController都有其对应的NIB文件。该文件的作用就是描述用户界面以及初始化对象和界面元素对象。虽然这些都可以在代码中来实现,但为了高效编写程序代码,xCode给我们提供了IB来绘制界面。而StoryBoard的引入,则是进一步加强了这方面的功能,之前的NIB文件没有办法描述ViewController之间的跳转过渡,只能通过代码中调用类似-presentModalViewController:animated:或-pushViewController:animated:这个两个方法来实现。现在,在StoryBoard中引入了Segue这一概念,由Segue定义从一个ViewController到另一个ViewController的过渡。只需要像之前连接界面对象和Action Method那样将ViewController之间用合适的Segue连接起来即可,无需任何手写代码。即使是自定义Segue,也只需编写Segue的实现,而无需编写调用的代码,一切都由StoryBoard帮我们调用。 

 要准确用好StoryBoard机制,必须严格遵守MVC原则。要让View和Controller充分解耦;并且不同的Controller之间也是充分解耦。所以AppDelegate就应该是处理UIApplication的回调,而不应该负责用户界面的处理。更不应该直接把AppDelegate当ViewController用,乃至直接在UIWindow上绘制界面。虽然,这有可能简单明了,毕竟UIWindow也是UIView的子类。但我们还是要有优良的习惯:由ViewController来负责处理View才是正确之道。从近期苹果针对xCode的项目模板的变化上看也反映这种优化趋势:

      在Xcode 4时,程序项目模板(如View-Based Application)开始鼓励使用UIWindow的rootViewController属性来指定第一屏的ViewController,以保证AppDelegate只专注于它应该做的事情。如今Xcode4.2引入StoryBoard后,AppDelegate就直接不管ViewController的事情了,第一屏使用的ViewController(即rootViewController)可以在StoryBoard中设置。

如何从NIB/XIB迁移到StoryBoard,有些什么改变?

  • ViewController不需要NIB/XIB文件,连接Outlet和Action的操作都可以在StoryBoard上完成。
  • 孤立View(独立于ViewController的View)是不能出现在StoryBoard里,所有View必须通过ViewController来管理。(这样,StoryBoard更像是Controller对象的容器,而不是View对象的容器,以前NIB/XIB倒显得可以视为View对象的容器)
  • ViewController之间的过渡代码不需要了,用StoryBoard的Segue直接可视化连接不同的ViewController。
  • UIWindow对象的作用被进一步淡化,在StoryBoard图上没有体现出AppDelegate对象——因为它本来就不应该来处理界面View的。
  • 代码编写要严格遵守MVC设计模式,才能用好StoryBoard来高效开发程序。

实践中的问题:
      XCode项目如果包含StoryBoard创建的,就无法在iOS 4.x的模拟器和iOS 4.x的真机上调试,运行,不报错,但是得到的结果只有黑屏。这应该是storyboard只有iOS5支持的原因吧。