本章指导读者创建了一个Storyboard文件、创建并设置了若干视图控制器、为这些对象构建界面并创建了相应的UIStoryboardSegue对象。这些都是Storyboards的基础知识,虽然还可以为Storyboard文件加入一些其他类型的UIStoryboardSegue对象和UIViewController对象,但是基本原理都是一样的。使用Storyboards的好处是可以减少部分需要编写的代码。
例如,push样式的UIStoryboardSegue对象代替了下面这段代码:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)ip
{
UIViewController *vc = [[UIViewController alloc] init];
[self.navigationController pushViewController:vc];
}
虽然Storyboards看上去很好用,但是本书作者认为Storyboards的缺点也不少。下面列举若干Storyboards的优缺点,其优点为:
•可以很快地开发出原型,向客户或同事演示界面流程。
•可以替代部分简单的代码。
•能很方便地为UITableView对象创建静态的UITableViewCell对象。
•自定义UITableViewCell对象时可以使用动态原型,不需要创建独立的XIB文件。
•使用Xcode显示Storyboard文件时,看上去感觉很好。
其缺点为:
•团队协作时,使用Storyboards会有困难。通常情况下,团队中的iOS程序员可以各自完成特定的UIViewController子类。但是,如果使用Storyboard文件来构建界面,那么所有人都必须使用同一个文件,不利于团队开发。
•代码管理工具很难处理Storyboard文件。如果有两个人同时编辑一个Storyboard文件(这在团队开发中很常见),那么代码管理工具(例如Subversion和Git)就会报告发生冲突,需要人工解决。
•会让简单的开发流程复杂化。假设要为某个应用编写一个UIViewController子类,然后为该应用的某个按钮实现动作方法,以模态的形式显示该子类的对象。如果直接通过编写代码来实现上述功能,就只需要创建UIViewController子类的对象(使用alloc方法和init方法),然后向当前的视图控制器(self)发送presentViewController: animated:completion:即可。如果通过Storyboards来实现上述功能,就需要先打开Storyboard文件、拖曳一个UIViewController对象、在标识检视面板中将Class修改为新的UIViewController子类,最后创建并设置UIStoryboardSegue对象。
•使用Storyboards开发应用时,会降低开发的灵活性。当读者要编写代码来实现某些功能时,Storyboard文件不仅无法提供帮助,反而会阻碍实现自定义代码。也就是说,和“在Storyboard文件所提供的基础功能上增加高级功能”相比,“直接用代码来实现基础功能和高级功能”的工作量反而可能更少。
•Storyboards总是会创建新的UIViewController对象。每当应用执行一个UIStoryboardSegue对象,就会创建一个新的目标UIViewController对象。但是在某些情况下,可能需要保留并重用某个UIViewController对象,而不是在关闭该对象时就释放相应的对象。Storyboards不支持重用UIViewController对象。
总之,Storyboards能让简单的代码更简单,复杂的代码更复杂。本书的例子代码没有使用Storyboards,而且作者自己在开发iOS应用时,也没有使用Storyboards。这里已经列出了Storyboards的优缺点,读者在开发iOS应用时,需要根据具体的情况自行决定是否使用Storyboards。