总结
Nibs/.xib 文件和 Storyboard 都是 Interface Builder 文件,用于在 Xcode 中直观地为 iOS 和 Mac 应用程序创建用户界面(我将使用 iOS 术语来表示类,因为这个问题被标记为 iOS,但它也适用于Mac 编程)。
区别
笔尖旨在与单个UIView 一起使用。它们还可以连接到UIViewController 子类,方法是将文件所有者的类设置为UIViewController 的任何子类并连接视图出口(使用Xcode 最右侧窗格中的连接检查器拖动以进行连接)。
故事板旨在包含 1 个或多个 UIViewController 的用户界面。您可以在单个故事板中构建整个用户界面,也可以将其分成更小的部分。
优势
应始终使用故事板来支持 .xib 文件/Nib(用于视图控制器)。故事板具有更多功能,并且由 Apple 积极开发。
每个支持 Nib 的论点都依赖于它们单独使用的事实,而情节提要包含许多场景。您可以像使用 Nibs 一样轻松地为每个 UIViewController 使用一个故事板(请参阅下面的代码示例)。继续阅读以获得详细的解释和代码示例。
详细
为什么 Storboards 优于 Nibs?
答案基本上归结为 Apple 鼓励使用 Storyboard 并在其中投入更多的开发精力。
- 故事板具有 Nibs 缺乏的缩放功能。说真的,你根本无法放大 Nibs,这在为小型笔记本电脑设计更大的屏幕时很糟糕。
- 笔尖缺少关键功能,例如:
- 您无需设置文件所有者的类。
反对故事板的基本论点是,将所有视图控制器放在一个位置会导致合并冲突、Xcode 缓慢、构建时间缓慢以及维护起来很麻烦。因此,一般建议是为每个 UIViewController 使用一个 Nib。
但是...您可以为每个 UIViewController 创建故事板。一种常见的做法(至少对我而言)是在类方法中隐藏所有 UIViewController 初始化(因为没有其他类需要知道控制器的 Nib/Storyboard 所在的文件的名称)。
让我们比较一下可能用于创建这种方法的相关代码 sn-ps。一行代码就是两者之间的全部区别。
目标-C
故事板
+ (ViewController *)create
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"ViewController" bundle:nil];
return [storyboard instantiateInitialViewController];
}
笔尖
+ (ViewController *)create
{
return [super initWithNibName:@"ViewController" bundle:nil];
}
用法
- (void)showMyViewController
{
ViewController *vc = [ViewController create];
[self presentViewController:vc animated:YES completion:nil];
}
斯威夫特
故事板
static func create() -> ViewController {
let storyboard = UIStoryboard(name: "ViewController", bundle: NSBundle.mainBundle())
return storyboard.instantiateInitialViewController() as! ViewController
}
笔尖
static func create() -> ViewController {
return ViewController(nibName: "ViewController", bundle: nil)
}
用法
func showMyViewController() {
let vc = ViewController.create()
self.presentViewController(vc, animated: true, completion: nil)
}
参数
我将讨论 Nibs 的所有常见论点;正如我之前提到的,大多数人支持单个文件,而不是作为 Nibs 而非 Storyboards 的论据
- 团队和合并
论点:拥有一个包含大量视图控制器的故事板将
如果您正在与多个团队合作,则会导致合并冲突
改变的人
响应:单个故事板不会导致比单个 Nib 更多的合并冲突
- 复杂性
论点:非常复杂的应用程序在情节提要中包含大量场景,这导致巨大的情节提要需要永远加载并且由于其大小而几乎无法理解。
响应:这是一个很好的观点,但您可以轻松地将故事板分成更小的部分。 Storyboard References 看起来是一个很棒的功能,可用于将 Storyboard 链接在一起,但它们仅在 Xcode 7/iOS 9+ 中可用。此外,仍然不是选择单个 Nib 而非 Storyboard 的理由。
-
可重用性
论点:为每个UIViewController 子类创建一个 Nib 可以让您重用代码,这样您就不必为情节提要中的每个场景设置所有约束和出口。
回应:同样,这不是选择单个 Nib 而非单个 Storyboard 的理由。