在iOS编程中,使用Storyboards而不是xib文件的好处有哪些?
Storyboards和.xib文件都是在Xcode中用于可视化创建iOS和Mac应用程序的界面构建器文件(我将使用iOS术语来表示类,因为这个问题标记为iOS,但它也适用于Mac编程)。
Nibs是用于单个UIView的。它们还可以通过将File's Owner的类设置为任何UIViewController的子类,并连接view outlet(在Xcode的最右侧窗格中使用Connections Inspector进行拖动连接)来连接到UIViewController子类。
Storyboards用于包含1个或多个UIViewController的用户界面。您可以在一个Storyboard中构建整个用户界面,也可以将其分成较小的部分。
Storyboards应始终优先使用.xib文件/Nibs(用于视图控制器)。Storyboards具有更多功能,并且由Apple积极开发。
每个支持Nib的论点都依赖于它们单独使用,而Storyboards包含许多场景。您可以像使用Nib一样轻松地为每个UIViewController使用一个Storyboard(请参阅下面的代码示例)。
Storyboards优于Nib的基本论点在于Apple鼓励使用Storyboards并在其上投入更多的开发工作。
1. Storyboards具有Nib缺少的缩放功能。Nib无法进行缩放,当在小型笔记本电脑上设计较大屏幕时,这非常不方便。
2. Nibs缺少关键功能,例如:
- UITableView的原型和动态单元格(更多信息)
- 顶部布局指南属性(请参阅评论)
- 可能还有其他功能,请在此列表中添加或评论
3. 您不需要设置Files Owner的类。
对Storyboards的基本反对观点是,将所有视图控制器放在一个地方会导致合并冲突、Xcode速度慢、构建时间长且维护起来非常麻烦。因此,一般建议为每个UIViewController使用一个Nib。
但是...您可以为每个UIViewController创建Storyboard。一种常见的做法(至少对我来说)是将所有UIViewController的初始化隐藏在一个类方法中(因为没有其他类需要知道控制器的Nib/Storyboard所在的文件的名称)。
让我们比较一下可能用于创建此类方法的相关代码片段。两者之间的唯一差异是一行代码。
Objective-C
Storyboard
+ (ViewController *)create { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"ViewController" bundle:nil]; return [storyboard instantiateInitialViewController]; }
Nib
+ (ViewController *)create { return [super initWithNibName:@"ViewController" bundle:nil]; }
Usage
- (void)showMyViewController { ViewController *vc = [ViewController create]; [self presentViewController:vc animated:YES completion:nil]; }
Swift
Storyboard
static func create() -> ViewController {
let storyboard = UIStoryboard(name: "ViewController", bundle: NSBundle.mainBundle())
return storyboard.instantiateInitialViewController() as! ViewController
}
Nib
static func create() -> ViewController {
return ViewController(nibName: "ViewController", bundle: nil)
}
Usage
func showMyViewController() {
let vc = ViewController.create()
self.presentViewController(vc, animated: true, completion: nil)
}
我将解决常见的Nib论点。正如我之前提到的,它们大多是支持单个文件的,而不是Nib优于Storyboards的论据。
1. 团队和合并
论据:如果您与多个人在一个团队上工作,那么具有大量视图控制器的Storyboard会导致合并冲突。
回应:一个Storyboard不会引起更多的合并冲突,就像一个Nib一样。
2. 复杂性
论据:非常复杂的应用程序在Storyboard中有很多场景,这导致了一个巨大的Storyboard,加载时间长且几乎无法理解。
回应:这是一个很好的观点,但是您可以将Storyboard轻松分成较小的部分。Storyboard引用是一项看起来非常不错的功能,可以用于链接Storyboard,但仅适用于Xcode 7 / iOS 9+。同样,这仍不是选择单独的Nib而不是Storyboards的原因。
3. 重用性
论据:为每个UIViewController子类创建一个Nib可以使您重用代码,因此您不必为Storyboard中的每个场景设置所有约束和outlets。
回应:同样,这并不是选择单独的Nib而不是单独的Storyboards的原因。
Storyboards和xib文件是iOS编程中常用的界面设计工具。虽然Storyboards相比xib文件有一些优势,但也存在一些问题。首先,使用Storyboards在团队中的协作不太方便,因为只有一个人可以同时编辑Storyboards文件。其次,如果需要使用一些Storyboards不支持的功能,将Storyboards和编程创建的视图混合在一起并不容易。此外,XCode关于Storyboards存在一些繁琐的bug,有时候Storyboard文件或其链接可能会损坏。对于复杂的项目,最好不要使用Storyboards。然而,随着时间的推移,Storyboards和Xcode的稳定性和文档越来越好,现在在大多数项目中使用Storyboards是可以推荐的。此外,新版的Xcode 5还提供了更好的团队合作功能,使得合并Storyboards代码变得更加容易。有些人认为Storyboards在初学者阶段非常有用,可以快速进行原型设计和开发,但是在进入中级阶段后,往往会发现代码的可预测性更高,因此更倾向于使用代码来进行界面设计。最后,虽然可以将Storyboards和非Storyboards代码混合使用,但在过去可能比较困难,现在已经变得相对简单。
使用Storyboards而不是xib文件在iOS编程中的好处是什么?
Storyboards是一个包含所有场景(视图控制器、导航控制器、标签栏控制器等)的容器,管理这些场景之间的连接和转换(称为Segues),以及控制器之间的通信机制。Storyboards给你一个完整的应用程序流程的视图,这是你从单独的nib文件中无法获得的。此外,使用Storyboards可以减少每个控制器拥有自己的nib文件时产生的混乱。
然而,使用Storyboards的唯一缺点是它只能在运行iOS 5或更高版本的设备上使用,无法在iOS 4或更低版本上运行。
下面是一些关于Storyboards的教程资源:
- Ray Wenderlich's提供了非常好的教程。
- 如果你是苹果开发者计划的成员,可以在iTunesU上查看去年的WWDC关于Storyboards的会议,非常棒。
- 最新的斯坦福iOS应用程序编程课程也提供了很好的教学资源。
此外,还有一些关于Storyboards的其他观点和补充:
- Storyboards具有一个主要缺点,即在使用git/svn进行多人编辑时可能会产生冲突。
- Storyboards还有一个重要的缺点是无法在文件级别上控制自动布局,每个xib文件可以选择使用自动布局或不使用,而使用Storyboards时,所有的控制器都必须使用或不使用自动布局。
使用Storyboards可以提供更好的可视化应用程序流程管理,并减少控制器之间的混乱,但也需要考虑兼容性和多人编辑时可能产生的冲突。