在iOS编程中,使用故事板相比于xib文件有哪些好处?

74

使用故事板和xib文件的主要区别是什么?

具体来说,使用故事板的优缺点是什么?

不幸的是,尽管进行了相当多的研究,但我所能找到的有关故事板的信息都只是简单的教程,仅仅告诉你如何设置一个故事板,而没有具体解释它们是什么。


2
如果你计划针对运行iOS 5以下版本的设备进行开发,那么故事板就不适用了。 - NJones
12个回答

83

故事板(Storyboard)是:

  • 所有场景(视图控制器、导航控制器、标签栏控制器等)的容器
  • 连接和转换这些场景之间的管理器(这些被称为连线)
  • 良好的方式来管理不同控制器之间的交互
  • 故事板为您提供了完整的应用程序流程视图,而您无法从单独的xib文件中获得此视图。
  • 降低了每个控制器各自拥有其自己的xib文件时产生的所有“混乱”。

我现在已经使用故事板一段时间了,唯一的缺点是无法针对iOS 4或更低版本进行。 故事板仅适用于运行iOS 5或更高版本的设备。 除此之外,优点很多,缺点在我看来不存在。

我看过的最好的教程是Ray Wenderlich's

此外,如果你是苹果开发者计划的成员,请查看去年WWDC关于故事板的会议(iTunesU),非常棒。

另一个很棒的教程(也在iTunesU上)是最新的Stanford iOS应用程序编程课程。


3
不对,看起来有人复制粘贴了。我在10个月前在Stackoverflow上发布了这篇文章,早于丹尼尔的帖子。不过你说得没错,两篇文章看起来几乎一模一样。 - LJ Wilson
是的,我看到了日期。确实使用了cmd+c cmd+v进行了移动! - Wojciech Rutkowski
2
根据法律规定,只有在给真正的作者署名的情况下,个人才被允许复制内容 :) 因为这个内容拥有创作共享版权。我之前也做过复制粘贴,但是都是以正确的方式来完成的。http://touchfever.blogspot.com.au/2012/06/what-is-recursion-best-explanation-in.html 这是给未来的复制粘贴者的提示! :) - TeaCupApp
看起来这个网站已经很久没有更新了,所以不用担心它。 - LJ Wilson
2
我想补充一点关于 Storyboards 的主要缺点 - 如果要让多个人使用 git/svn 编辑它,那么就祝你好运了。即使只是打开 storyboard 也会引起巨大的冲突。尽管如此,Storyboards 在其他方面确实非常出色。 - LyricalPanda
也许你可以添加“文件级别”的开/关AutoLayout,每个xib可以使用自动布局或不使用,对于storyboard,所有的视图都应该使用它或者都不使用... - ıɾuǝʞ

52

使用Storyboard有利也有弊,以下是一些缺点:

  • 在团队中使用SB并不容易,因为只有一个参与者可以同时处理SB(因为它只是一个文件)。

-以下陈述不正确: -如果您需要使用SB无法提供的功能,则很难将SB与编程创建的视图结合使用(尽管可能是可行的)

经验准则是:您预计项目变得越复杂,则最好不要选择SB。

编辑: -SB的另一个缺点:解决XCode中所有讨厌的SB错误。例如,由于多个不一致性,经常需要清空DerivedData文件夹。有时Storyboard文件或链接会损坏。然后,您可能需要寻找问题所在。请查看此线程以了解详情

编辑2(2013年3月):与此同时,Storyboards和Xcode运行效果更好,并且文档和最佳实践已经广泛传播。我认为对于大多数项目来说,可以推荐使用故事板,即使仍然存在一些小问题。

编辑3(2013年9月):现在随着新的Xcode 5格式,使用SB在团队中的效果可能会更好,因为似乎现在可以更容易地合并SB代码了。

另一个编辑:如果你有一小时的时间,请坐下来,放松,听听这些人讨论这个话题(Ray Wenderlich & Co)

编辑于2016年1月:长期以来,我一直是Storyboard的支持者,但是在过去几个月里,我与之遇到了很多麻烦,因此我决定尽可能地放弃使用Storyboard。原因是苹果公司添加了许多愚蠢的功能,但并不关心错误和缺陷。具有许多自动布局约束的性能真的很差(在设计时),而出错的可能性变得非常大。 例如:即使是更简单的Storyboard,在在Xcode中打开项目后也会进入“脏模式”(见git状态)。 提示:作为初学者,你会喜欢Storyboard,因为你可以快速进行原型设计并运行,而不需要很多代码。当你进入中级阶段时,你将向你的项目中添加更多GUI代码。现在你开始在代码和SB之间来回切换 - 事情开始变得更糟。迟早你会倾向于在代码中完成大部分的GUI工作,因为结果比有几个来源更可预测。


我非常有兴趣看到你第二点的例子。 - Sébastien
实际上,将SB与非SB代码混合使用相当容易。这里有一个关于如何做到这一点的讨论:https://developer.apple.com/videos/wwdc/2012/?id=407 - jbbenni
@jbbenni:你说得对。同时,文档变得更好,很多错误也被修复了。我会修改我的答案。 - brainray
使用Storyboard和源代码控制可能有点烦人,正如@brainray所暗示的那样。 - NSTJ

9

概述

Nibs/.xib文件和Storyboards都是Interface Builder文件,用于在Xcode中为iOS和Mac应用程序创建用户界面(由于此问题标记为iOS,因此我将使用iOS术语来表示类,但它也适用于Mac编程)。

区别

Nibs旨在与单个UIView一起使用。它们还可以通过将File's Owner的类设置为任何UIViewController子类并连接视图出口(使用Xcode右侧窗格中的Connections Inspector进行拖动连接)与UIViewController子类相连。

Storyboards旨在包含1个或多个UIViewController的用户界面。您可以在单个storyboard中构建整个用户界面,也可以将其分成更小的部分。

优点

应始终使用Storyboards而不是.xib文件/Nibs(对于视图控制器)。Storyboards具有更多功能,并由Apple积极开发。

每个支持Nibs的论点都依赖于它们被单独使用,而故事板包含许多场景。您可以像使用Nibs一样轻松地为每个UIViewController使用单个Storyboard(请参见下面的代码示例)。继续阅读以获取详细说明和代码示例。

详细

为什么Storboards优于Nibs?

基本上答案归结为Apple鼓励使用Storyboards并将更多开发工作投入其中。

  1. 故事板具有缩放功能,而 Nib 缺乏此功能。当在小型笔记本上设计更大屏幕时,Nib 无法进行任何缩放,这真的很糟糕。
  2. Nib 缺少关键功能,例如:
    • UITableView 的原型和动态单元格(更多信息
    • 顶部布局指南 属性(请参见注释)
    • 可能还有其他功能,请编辑或评论以添加到此列表中
  3. 您不需要设置 Files Owner 的类。

反对故事板的基本论点是将所有视图控制器放在一个地方会导致合并冲突、Xcode 缓慢、构建时间长,并且维护起来非常麻烦。因此,一般建议为每个 UIViewController 使用一个 Nib。

但是... 您可以为每个 UIViewController 创建故事板。一个常见的做法(至少对我来说)是将所有 UIViewController 的初始化隐藏在一个类方法中(因为没有其他类需要知道控制器的 Nib/Storyboard 存储位置的名称)。 让我们比较一下可能用于创建此类方法的相关代码片段。一行代码是两者之间的全部区别。

Objective-C

Storyboard

+ (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];
}

Swift

故事板

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)
}

使用方法

func showMyViewController() {
    let vc = ViewController.create()
    self.presentViewController(vc, animated: true, completion: nil)
}

参数

我将讨论所有关于Nibs的常见参数;正如我之前提到的,这些大多数是支持单个文件的,而不是支持Nibs而不是Storyboards的参数。

  1. 团队和合并

参数:如果您与多个人一起工作,则具有许多视图控制器的Storyboard会导致合并冲突。

回应:单个Storyboard与单个Nib一样不会引起更多合并冲突。

  1. 复杂性

参数:非常复杂的应用程序在Storyboard中有很多场景,这导致一个巨大的Storyboard需要很长时间才能加载,并且由于其大小几乎无法理解。

回应:这是一个很好的观点,但您可以轻松地将Storyboard分成较小的部分。Storyboard References看起来是一个很棒的功能,可以用于链接Storyboard,但它们仅在Xcode 7 / iOS 9+中可用。此外,这仍然不是选择单独的Nib而不是Storyboard的原因。

  1. 可重用性

论点:为每个UIViewController子类创建一个Nib文件,可以使您重用代码,这样您就不必为故事板中的每个场景设置所有约束和插座。

回应:同样,这并不是选择单独的Nib文件而不是单独的故事板的理由。


5

故事板的其他好处:

  • 故事板对于表格视图有更好的支持。您可以使用“动态”和“原型”单元格。
  • 使用故事板更容易实例化视图控制器。您可以执行此类操作:[self.storyboard instantiateViewControllerWithIdentifier:]
  • 故事板支持视图控制器容器,因此您可以以图形方式布置子视图控制器。

缺点是:

  • 当故事板包含大量视图控制器时,在XCode中渲染速度较慢。

  • 无法在故事板中为一个视图控制器启用自动布局。


5

几个月前在LiDG会议上有一场关于Storyboard的精彩演讲,这里可以看到。

个人认为对于新应用程序来说,Storyboard是可行的方式。虽然对于非常复杂的应用程序存在一些缺陷,但优点大多数情况下胜过缺点。


2
希望有一些更详细的东西,但不要像典型的苹果文档那样令人昏昏欲睡。 - Hot Licks
非常感谢你,演示很棒!! - swiftBoy

3

请注意,如果您使用故事板(Storyboards),您的应用程序将不兼容旧版操作系统安装。


1
当使用新功能或API时,这几乎总是一个问题。如果这将成为App Store中出售的应用程序,那么这肯定值得考虑。考虑到上个季度销售了多少iPhone 4S并且有多少设备已更新到iOS 5,这不是大多数人认为的那样令人担忧。及时跟进最新的功能和API也非常重要,否则作为开发人员,您将很快被落下。 - LJ Wilson
确实,你应该跟上最新的功能和API。我总是尝试着想出一个项目,这样我就可以在新功能发布时进行实验,但我会尽量避免在发布的应用中使用新功能,直到它们已经存在一段时间了。不可否认,故事板(storyboards)几乎已经到了应该被考虑的地步。 - Beleg
故事板已经过了8个月的生产应用期。由于它们可以与现有的nibs轻松共存,并且iOS 5已被超过85%的iOS用户采用,因此我认为没有理由不使用它们。我有10多个生产应用程序使用某种程度的故事板UI。 - LJ Wilson
当开始使用故事板时,这是一个已知的事实。这个答案并没有完整的故事... - Johan Karlsson
要获得点赞,你需要花更多时间撰写答案。仅仅陈述显而易见的事情是不够的。这个问题是关于使用Storyboard的优缺点。 - Johan Karlsson

2

故事板基本上是一种使开发者工作更轻松的工具。它被编译成一系列的nib文件,因此性能几乎相同,但对于开发者来说,能够快速查看整个应用程序流程的概述非常棒。

我开始转向在新项目中使用故事板,只要我能说服客户接受iOS 5作为最低版本。这纯粹是因为我更喜欢这样做,并且完成相同任务所需的时间更少。


1

故事板的问题比好处多得多。以下是它们的问题列表,从iraycd复制:

  • 故事板在运行时失败,而不是在编译时失败:您的故事板中有拼写错误的segue名称或连接不正确?它会在运行时崩溃。您在故事板中使用了一个自定义的UIViewController子类,但在故事板中不存在?它会在运行时崩溃。如果您在代码中执行此类操作,您将在编译时及早捕获它们。 更新:我的新工具StoryboardLint大多解决了这个问题。

  • 故事板很快变得令人困惑:随着项目的增长,您的故事板变得越来越难以导航。此外,如果多个视图控制器具有多个segue到多个其他视图控制器,则您的故事板很快就会看起来像一碗意大利面条,您将发现自己在缩放和滚动中寻找您正在寻找的视图控制器和查找segue指向何处。 更新:通过将您的故事板拆分为多个故事板,可以解决此问题,如Pilky的本文Robert Brown的本文所述。

  • 故事板使团队合作更加困难:因为您通常只有一个用于整个项目的巨大故事板文件,让多个开发人员定期对该文件进行更改可能会令人头痛:更改需要合并和解决冲突。当发生冲突时,很难确定如何解决它:Xcode生成故事板XML文件,它实际上并不是以人类将要阅读,更不用说编辑它的目标而设计的。

  • 故事板使代码审查变得困难或几乎不可能:同行代码审查是团队中要做的好事情。但是,当您对故事板进行更改时,几乎不可能使用不同的开发人员审查这些更改。您可以拉出的只是巨大XML文件的差异。弄清楚到底发生了什么变化,这些变化是否正确或是否破坏了某些内容,真的很难。

  • 故事板阻碍了代码重用:在我的iOS项目中,我通常创建一个包含我在整个应用程序中使用的所有颜色、字体、边距和插图的类,以使其具有一致的外观和感觉:如果我必须为整个应用程序调整这些值,只需更改一行即可。如果您在故事板中设置此类值,则会重复它们,并且需要找到每个单独的实例以进行更改。有很大的机会你会错过其中一个,因为在故事板中没有搜索和替换。

  • 故事板让您做两次工作:您是否正在构建可以在iPad和iPhone上运行的通用应用程序?当您使用故事板时,通常会有一个用于iPad版本的故事板和一个用于iPhone版本的故事板。保持两者同步需要您在两个位置上进行每个UI或应用程序工作流更改。耶。更新:在iOS 8和Xcode 6


1
你对自动布局的态度也可能会影响你是否想使用故事板。使用xib,可以在每个.xib上启用或禁用自动布局,允许在应用程序中进行混合,而故事板则将你的选择应用于它们包含的所有视图。

另一方面,您可以使用多个故事板。 - KPM

1
你可以在一秒钟内看到整个大局。但是,如果有很多NIB文件,你就看不到整个大局了。这样做可以更轻松地维护你的程序,更容易理解别人的程序...等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接