UI -- StoryBoard优缺点分析

StoryBoard--看上去很美

Storyboard 有时也称为 Storyboarding,二者经常混用。 如果你的英文足够好,也许能体会到二者的细微差别。 在谈及Storyboard之前,我们先来了解下 Interface builder 的背景。 Interface Builder 简称 IB,是XCode 开发环境自带的 用户图形界面设计工具, 通过它,你可以随心所欲地将 控件或对象(Object)拖拽到 视图中。 这些控件被存储在一个 XIB (发音为 zib) 或NIB 文件中。 XIB 很容易理解, 说白了, XIB文件就是一个 XML 格式的文件, 你可以通过编辑工具打开改写这个Xib 文件。 当程序编译时, 这些视图控件被编译成一个NIB 文件。 我们先来对NIB有一个基本的认识。通常,NIB是与ViewController相关联的,很多ViewController都有对应的NIB文件。NIB文件的作用是描述用户界面、初始化界面元素对象。 其实,开发者在NIB中所描述的界面和初始化的对象 都能够在代码中实现。之所以用Interface Builder 来绘制页面,是为了减少那些设置界面属性的重复而枯燥的代码,让开发者能够集中在功能的实现上。 在XCode 4.2 之前, 每创建一个视图,就要生成一个相应的XIB 文件。 当一个应用有多个视图时,视图之间的跳转管理将变得十分复杂。 为解决这个问题, Apple 推出的 Storyboard 可谓及时而实用。 看看Apple对Storyboard的评论吧: "Discover how Xcode's Interface Builder support for Storyboarding in iOS 5 makes designing your iOS apps so much easier. Storyboarding allows you to graphically arrange all your views within a single design canvas, where you can then define the app's logical flow, and even assign transition animations." NIB文件无法描述从一个ViewController到另一个ViewController的跳转,这种跳转只能靠手写代码来实现。相信很多人都会经常用到 -presentModalViewController:animated: 以及-pushViewController:animated: 这两个方法。 Storyboarding 的出现,使得这种方式成为历史,取而代之的是 Segue [Segwei]。 Segue 定义了从一个ViewController 到另一个ViewController的跳转。我们在 IB 中,已熟悉如何连接见面元素对象和方法 (Action Method)。 在Stroyboard中,我们完全可以通过Segue,将ViewController 连接起来,而不再需要手写代码了。 如果你想自定义 Segue,你也只需写 Segue 的实现,而无需编写调用的代码, Storyboard 会自动调用。 要用好Storyboard机制,必须严格遵守MVC原则。 View 与 Controller 需完全解耦,并且不同的Controller 之间也要充分解耦。 在开发iOS 应用程序时,创建一个视图(View),有两种实现方法, 一是在Interface Builder 中,拖拽一个UIView控件, 另一种方法是通过原生代码方式。两种方法各有利弊。 IB 方式看似简单,但在View 之间跳转时,不便操控; 而原生代码(这种纯手写代码)方式,代码工作量巨大。 哪怕仅仅创建几个Label,就得手写上百行代码,每个Label 都得设置坐标。 为解决以上问题Apple 近期发布的 iOS5 新增 Storyboard 功能。 Storyboard 是什么东东? 简单来说,Storyboard是Xcode 4.2 自带的工具, 主要用于iOS5 以上版本。 早期的InterfaceBuilder 所创建的 View , 各个View之间是互相独立的,没有相互关联,当一个应用程序有多个View 时, View 之间的跳转很是复杂。为此Apple 为开发者带来了福音—Storyboard。尤其是使用导航栏和标签栏的应用, Storyboard 大大简化了各个视图之间的切换, 并由此简化了管理视图控制器的开发过程,我们完全可以指定视图的切换顺序,而不用手工编写代码。 Storyboard 能够包含一个程序的所有的ViewController 以及它们之间的连接。在应用开发时,可将UI Flow作为Storyboard 的输入,一个看似完整的UI在Storyboard唾手可得。

DEC 15TH, 2012

介绍

StoryBoard是苹果在2011年的WWDC Session 309《Introducing Interface Builder Storyboarding》中介绍的Interface Builder的新功能。其基本想法是将原本的xib进行升级,引入一个容器用于管理多个xib文件,并且这个容器可以通过拖拽设置xib之间的界面跳转。而这个容器就是被苹果称做的StoryBoard。下图是一个Storyboard的截图。

优点

总体上来说,Storyboard有以下好处:

  1. 你可以从storyboard中很方便地梳理出所有View Controller的界面间的调用关系。这一点对于新加入项目组的开发同事来说,比较友好。
  2. 使用Storyboard可以使用Table View Controller的Static Cell功能。对于开发一些Cell不多,但每个Cell都不一样的列表类设置界面会比较方便。
  3. 通过实现 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法,每个View Controller的跳转逻辑都聚集在一处,这方便我们统一管理界面跳转和传递数据。
  4. Storyboard可以方便将一些常用功能模块化和复用。例如WWDC2011年介绍Storyboard的视频就将微博分享功能模块化成一个单独的Storyboard。我在开发App时,也将例如通过第三方注册登录模块做成一个单独的Storyboard,便于以后复用。

缺点

我在新项目使用Storyboard时,却发现它只是看上去很美,真正用起来,却有很多问题,我发现的问题有:

  1. 首先它和xib一样,对版本管理是灾难。因为是它实际上的多个xib的集合,所以更容易让多人编辑产生冲突。苹果对storyboard的设计也不好,基本上你只要打开,什么都不做,这个文件就会被更改,所以冲突几乎是不可避免的—除非你不打开,实在不小心打开看了,需要在提交前回退成服务器上的版本。
  2. Storyboard提供的 Static cell特性只适合于UITableViewController的子类。我很多时候的用法是一个TableView嵌套在另一个UIView中,static cell就不能用了。
  3. segue的概念对于开发来说并不省事,如果是用程序内部trigger一个segue,那么需要在另一个回调的地方设置dest view controller的参数信息。

总结

我仔细比较权衡了一下优缺点,最主要的问题是我的版本管理在多人协作开发时将陷入灾难,而这是完全不能接受的。而最主要的好处就是,你可以在一个类似白板的地方“一揽众山小“一样了解所有界面之间的切换关系,但这个有那么重要吗?我自已其实很清楚跳转逻辑,这个只是对新同事了解项目代码时有帮助,那我花一点时间直接给他讲讲画画不就搞定的吗?为了这点好处而让版本管理无法使用,是完全不能接受的。

所以最终我决定放弃使用StoryBoard了,这个“看上去很美”的功能有着不可接受的缺陷。现在看来,它仅适用于做一些Demo的开发。苹果一直没有处理好这类可视化界面设计功能的版本管理,象xib文件,虽然是xml格式的,但如果多人编辑了,合并起来也会很麻烦。所以业界好多同行都不用xib,直接用纯代码来写界面,虽然稍慢一点儿,但是工程很干净,也基本没有了多人协作的版本冲突问题。

 Dec 15th, 2012  iOS

原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值