在iOS编程中使用Storyboards而不是xib文件有什么好处?


70

使用情节提要和Xib文件之间的主要区别是什么?

具体来说,使用情节提要的优点或缺点是什么?

不幸的是,尽管进行了大量研究,但我在情节提要板上能够找到的只是简单的教程,向您展示了如何设置情节提要,而没有具体的信息说明其含义。


2
如果计划在运行<iOS 5故事板的目标设备上使用。
NJones

Answers:


83

情节提要是:

  • 所有场景的容器(视图控制器,导航控制器,TabBar控制器等)
  • 这些场景之间的联系和过渡的经理(这些人称为Segues)
  • 管理不同控制器之间如何通讯的一种好方法
  • 情节提要提供了一个完整的应用程序流程视图,您永远无法从漂浮的单个nib文件中获得应用程序流程。
  • 当您有多个控制器各自拥有自己的nib文件时,发生的所有“混乱事件”的化简。

我已经使用Storyboard已有一段时间了,唯一的缺点是您不能针对iOS 4或更低版本。情节提要仅在运行iOS 5或更高版本的设备上工作。除此之外,这样做的好处是很多的,而国际海事组织则不存在弊端。

我见过的最好的教程是Ray Wenderlich的

另外,如果您是Apple Developer计划的成员,请查看去年在Storyboard(iTunesU)上的WWDC会议,它很棒。

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


3
不,看起来有人在进行复制和粘贴。我在Danial发帖之前10个月在Stackoverflow上发布了此内容。您说得对,但看起来几乎一样。
LJ威尔逊

是的,我看到了约会。cmd + c cmd + v确实在移动!
Wojciech Rutkowski

2
根据法律,由于内容具有创作共用权利,因此只有在向真实作者鸣谢时才允许该人复制:)。我之前已经完成过复制粘贴,但是以正确的方式进行过。touchfever.blogspot.com.au/2012/06/…为了将来的复制粘贴!:)
TeaCupApp

似乎该网站已不再更新,因此不必担心。
LJ威尔逊

1
我想补充一点,情节提要有一个主要缺点-祝好运,有多个人使用git / svn对其进行编辑。即使打开情节提要板也会经常标记其中的变化,从而引起巨大的冲突。话虽如此,情节提要对其他所有功能都很有用。
LyricalPanda 2014年

52

情节提要不仅有优点,也有缺点-只是因为您要求输入:

  • 与团队中的SB一起工作并不容易,因为一次只有一名参与者可以同时处理SB(因为这是一个文件)。

-以下是不正确的: -如果您需要执行SB无法提供的功能,那么将SB与以编程方式创建的视图混合起来并不是一件容易的事(虽然有可能)

经验法则似乎是:您期望项目变得越复杂,就越不会选择SB。

编辑:-SB的另一个缺点:解决XCode关于SB的所有烦人的bug。例如,由于多个不一致,不得不频繁刷新DerivedData文件夹。有时情节提要文件或指向它们的链接会损坏。然后,您可能会很高兴寻找问题。看看这个线程来了解这个想法

编辑2(2013年3月):同时,情节提要和Xcode的运行情况要好得多,文档和最佳实践也得到了广泛传播。我认为对于大多数项目,都建议使用情节提要,即使仍然存在一些故障。

编辑3(2013年9月):现在,与新的Xcode 5格式一起在SB团队中工作可能会变得更好,因为现在似乎可以更轻松合并SB代码。

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

编辑2016.1:作为Storyboard的倡导者很长一段时间后,我在过去几个月中遇到了很多麻烦,因此我决定尽可能地放弃Storyboard。这样做的原因是苹果增加了愚蠢的功能,但并不在乎错误和缺陷。具有很多自动布局约束的性能确实很差(而在设计时),并且容易出错。例子:即使是不太复杂的情节提要板,在Xcode中打开一个项目后,也会立即进入“脏模式”(请参阅​​git state)。提示:作为初学者,您会喜欢情节提要,因为您可以快速制作原型并无需大量代码即可开始运行。进入中间状态时,将向项目添加更多GUI代码。现在,您开始在代码和SB之间来回移动-事情开始变得更糟。


我很想看到您第二点的例子。
2013年

实际上,将SB与非SB代码混合起来非常容易。以下是有关如何执行此操作的讨论:developer.apple.com/videos/wwdc/2012/?
id=407

@jbbenni:你是对的。同时,文档变得更加完善,并且修复了许多错误。我将编辑答案。
brainray 2013年

使用情节提要和源代码管理可能会有些烦人,因为@brainray暗示
NSTJ 2013年

9

概要

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

差异性

笔尖旨在与一个单独使用UIView。也可以通过将UIViewControllerFile Owner的类设置为任何子类UIViewController并将其连接到视图出口(使用Xcode最右侧窗格中的Connections Inspector拖动以进行连接)来将它们连接到子类。

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

优点

应始终使用情节提要板以支持.xib文件/ Nib(用于视图控制器)。故事板具有更多功能,并且由Apple积极开发。

支持Nibs的每个论点都依赖于这样的事实,即故事板包含许多场景时,它们会单独使用。您可以UIViewController像使用Nibs一样轻松地为每个脚本使用一个情节提要(请参见下面的代码示例)。请继续阅读以获取详细的解释和代码示例。

详细

为什么Storboard优于Nibs?

答案基本上归结为Apple鼓励使用Storyboard,并在其中进行更多开发。

  1. 故事板具有Nibs缺乏的缩放功能。认真地讲,您无法完全放大Nibs,这在为小型笔记本电脑设计更大的屏幕时会很烂。
  2. 笔尖缺少关键功能,例如:
    • 原型和动态单元格,用于UITableView更多信息
    • 顶部布局引导物业(见注释)
    • 可能还有更多,如果您要添加到此列表中,请进行编辑或评论
  3. 您无需弄乱设置“文件所有者”的类。

反对情节提要的基本论点是,将所有视图控制器放在一个位置会导致合并冲突,Xcode速度慢,构建时间慢以及维护的麻烦。因此,一般的建议是为每个使用Nib UIViewController

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

目标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超过Storyboard的论点

  1. 团队与合并

论点:如果您的团队中有很多人进行更改,那么拥有一个带有很多视图控制器的情节提要将导致合并冲突。

响应:一个情节提要板引起的合并冲突不会比单个Nib多

  1. 复杂

论点:非常复杂的应用程序在Storyboard中具有很多场景,这导致了一个巨大的Storyboard,需要永久加载,并且由于其大小而难以理解。

响应:这是一个好点,但是您可以轻松地将情节提要分解成较小的部分。故事板引用看起来像一个很棒的功能,可用于将故事板链接在一起,但仅在Xcode 7 / iOS 9+中可用。同样,仍然不是在Storyboard上选择单个笔尖的理由。

  1. 重用性

参数:为每个UIViewController子类创建一个Nib可使您重用代码,因此不必为情节提要中的每个场景设置所有约束和出口。

回应:同样,这不是选择单个Storyboard而不选择单个Nib的理由。



5

故事板的其他优点:

  • 故事板对表视图具有更好的支持。也就是说,您可以使用“动态”和“原型”单元格。
  • 使用情节提要板实例化视图控制器更加容易。您可以执行以下操作:[se lf.storyboard InstantiateViewControllerWithIdentifer:]
  • 情节提要板支持视图控制器容器,因此可以以图形方式布置子视图控制器。

缺点是:

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

  • 无法为情节提要中的一个视图控制器启用自动布局。


3

请注意,如果使用Storyboards,则您的应用程序与旧版OS安装不兼容。


1
使用新功能或API时,这几乎总是一个问题。如果这将是要在App Store中出售的应用程序,那么这肯定值得考虑。考虑到上个季度售出了多少iPhone 4S,以及有多少设备已更新到iOS 5,这与大多数人认为的担心并不接近。紧跟最新功能和API还是非常重要的,否则作为开发人员的您将很快落伍。
LJ威尔逊

的确,您应该了解最新的功能和API。我总是尝试并提出一个项目,以便在发布新功能时可以进行试验,但是我会尝试将新功能隔离在已发布的应用程序中,直到它们出现一段时间为止。诚然,情节提要几乎到了应该考虑的地步。
Beleg 2012年

情节提要大约要在生产应用程序中使用8个月之后。由于它们可以与现有笔尖轻松共存,并且iOS 5已被超过85%的iOS用户群所采用,因此我不认为不使用它们是有原因的。我有10多个使用某些故事板UI的生产应用程序。
LJ威尔逊

当开始使用情节提要时,这是一个已知的事实。答案并没有给出完整的故事……
Johan Karlsson 2013年

为了获得赞誉,您需要花费更多的时间来编写答案。陈述显而易见的是不够的。问题是故事板有哪些优点/缺点。
Johan Karlsson 2013年

2

故事板基本上是一种使您作为开发人员的工作更轻松的设备。它被编译为一系列的nib文件,因此性能几乎是相同的,但是对于开发人员来说,能够快速查看整个应用程序流程是一件很棒的事情。

我开始过渡到在新项目上使用情节提要,前提是我可以说服客户端接受最低版本的iOS 5。这纯粹是因为我更喜欢这样做,并且花费更少的时间来完成相同的任务。


1

您对自动版式的态度也可能会影响您是否要使用情节提要。使用xib,您可以基于每个.xib启用或禁用“自动布局”,从而允许在应用程序中混合使用,而Storyboard则将您的选择应用于它们包含的所有视图。


同样,您可以使用多个情节提要。
KPM

1

您在一秒钟内就能看到大图景。好了,NIB文件很多,您看不到全局。易于维护程序。更容易理解其他程序...。


1

优点:

1)设计界面非常好

2)您可以使用StoryBoard Segues以一种很酷的方式识别导航/模式关系。

3)如果您的应用支持多种设备,这是组织不同视图的好方法。

4)原型制作是另一个额外的优势。

5)原型UITableViewCell可以节省时间,并且也减少了代码量。

6)您可以使用StoryBoard在一处查看该应用程序的所有屏幕。

7)您可以轻松查看它们之间的关系

8)如果您正在使用某人的代码,则可以更好地了解应用程序的流程。

9)您可以通过应用情节提要中的视网膜形状因子来设置iPhone 4和iPhone 5的用户界面,而无需一次又一次运行该应用程序。

10)客户可以在开始开发应用程序之前先查看其原型,这里的故事板可以为您提供很多帮助。

缺点:

1)仅在iOS 5+中可用

2)StoryBoardSegues有点僵化,您可以多次使用prepareForSegue。

4)像IB一样,与其他显示引擎和工具包不太友好。

4)很难共享一个视图或一组视图的设计-您必须全部发送或不发送任何内容。

5)对于情节提要,特别是在iPad的情况下,您将需要大屏幕。

6)将视图从其他应用程序复制到情节提要时遇到困难。

7)当多个开发人员使用git仓库处理同一个项目时,情节提要中的问题

从某些资源复制


关于缺点:1不再是问题。4是错误的,除非您的应用程序简单明了,否则请不要在所有应用程序中使用大型独特的故事板;只需将其分成一致的部分即可。xib也适用于7,如果使用情节提要对您而言更糟,则说明您的情节提要还不够好。8没有道理。
KPM

您能否澄清劣势8?我不懂你 提前致谢。
里卡多2015年

1

故事板的弊大于利。以下是从iraycd复制的问题列表:

  • 情节提要在运行时失败,而不是在编译时失败:您是否在segue名称中输入错字或在情节提要中将其错接?它将在运行时爆炸。您使用的故事板中不再存在自定义的UIViewController子类?它将在运行时爆炸。如果您在代码中执行此类操作,则将在编译期间及早发现它们。更新:我的新工具StoryboardLint主要解决了此问题。

  • 情节提要快速变得混乱:随着项目的发展,情节提要变得越来越难以导航。另外,如果多个视图控制器与多个其他视图控制器有多个关卡,则故事板很快就会开始看起来像一碗意大利面,并且您会发现自己放大和缩小并在各处滚动以查找所需的视图控制器寻找并找出什么塞格点在哪里。更新:这个问题可以主要通过分割你的故事板最多可以解决成多个故事板,如在本文中通过Pilky本文由罗伯特·布朗

  • 情节提要使团队的工作更加困难:因为通常项目中只有一个庞大的情节提要文件,所以让多个开发人员定期对一个文件进行更改可能会令人头疼:需要合并更改并解决冲突。当发生冲突时,很难说出解决方案:Xcode生成情节提要XML文件,并且它的设计并不是以人类必须阅读为目标,更不用说对其进行编辑了。

  • 分镜脚本使代码审查很难或几乎不可能进行:对您的团队来说,对等代码审查是一件很棒的事情。但是,当您对情节提要进行更改时,几乎不可能与其他开发人员一起查看这些更改。您所能提供的只是一个巨大的XML文件的差异。解密真正改变的内容以及这些改变是否正确或是否破坏了某些东西确实很难。

  • 故事板阻碍了代码的重用:在我的iOS项目中,我通常创建一个类,其中包含我在整个应用程序中使用的所有颜色,字体,边距和插图,以使其具有一致的外观和感觉:如果必须调整整个应用程序的所有这些值。如果在情节提要中设置了此类值,则将其复制,并在要更改它们时需要查找所有单个出现的值。因为错过了故事板中的搜索和替换功能,因此您很可能错过其中一项。

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

  • 情节提要板需要不断进行上下文切换:我发现自己在代码中的工作和浏览速度比情节提要板快得多。当您的应用使用情节提要时,您会不断切换上下文:“哦,我想在此表视图单元上点击以加载其他视图控制器。现在,我必须打开情节提要,找到合适的视图控制器,创建新的界面到另一个视图控制器(我也必须找到),给segue一个名称,记住该名称(我不能在情节提要中使用常量或变量),切换回代码并希望我不要键入错误的名称这是我的prepareForSegue方法的序号。我希望如何在我现在所在的位置键入这三行代码!” 不,不好玩。在代码和情节提要之间(以及在键盘和鼠标之间)切换会很快变老,并使您减速。

  • 情节提要很难重构:重构代码时,必须确保它仍然符合情节提要所期望的。在情节提要中移动内容时,只有在运行时仍能与您的代码一起使用,您才会发现它。在我看来,我好像必须保持两个世界同步。我的拙见使我感到脆弱,使人沮丧。

  • 情节提要板不可搜索:使用情节提要板时,在Xcode中进行项目范围内的搜索实际上并不是项目范围内的搜索。它们不包括在搜索中。因此,当从代码中删除自定义类或对其进行重命名时,您将必须手动浏览情节提要或查看其原始XML,以确保它与代码更改保持一致。不,先生,我不喜欢。更新:故事板可以在Xcode 6中搜索。

  • 故事板的灵活性较差:在代码中,您基本上可以做任何您想做的事情!使用情节提要板,您只能使用代码中的一部分。尤其是当您想对动画和过渡进行一些高级操作时,您会发现自己正在“与情节提要进行战斗”以使其发挥作用。

  • 情节提要不允许您更改特殊视图控制器的类型:您要将a更改UITableViewControllerUICollectionViewController?还是变成了平原UIViewController?在情节提要中不可能。您必须删除旧的视图控制器并创建一个新的视图控制器,然后重新连接所有segue。进行这样的代码更改要容易得多。

  • 情节提要向项目增加了两个额外的责任:(1)情节提要编辑器工具,用于生成情节提要XML;以及(2)运行时组件,用于解析XML并从中创建UI和控制器对象。这两个部分都可能包含无法修复的错误。

  • 情节提要不允许您将子视图添加到UIImageView:谁知道原因。

  • 情节提要不允许您为单个View(-Controller)启用自动布局:通过选中/取消选中情节提要中的“自动布局”选项,所做的更改将应用​​于情节提要中的所有控制器。(感谢SavaMazăre!)

  • 情节提要具有破坏向后兼容性的更高风险:Xcode有时会更改情节提要的文件格式,并且不以任何方式保证您可以打开几年后甚至几个月后今天创建的情节提要文件。(感谢这一点的思想优势。请参阅原始评论

  • 这是麦当劳:用乔布斯(Steve Jobs)关于微软的话来说:麦当劳(视频)


0

在iOS 7之前的版本中,情节提要非常整洁,但并非必须具备。他们介绍了解决的许多问题。iOS 7使故事板可以达到平衡。

在iOS 8和9上,这不再是一个问题:使用故事板!

情节提要的主要缺点是,您完全依赖XCode,并且可能最终会花费数小时来处理XCode错误。但是XCode变得更好了,并且Storyboard的优点现在太多了,不容忽视。表格视图单元原型,Size类,自动布局支持等。

一些技巧:

  • 将每个情节提要板视为属于在一起的视图控制器的容器。不要将其视为整个应用程序的宏大布局。
  • 您可能需要多个故事板
  • Segues实际上仅对最琐碎的用例有用-它们非常有用。但是在现实世界中,应用程序会在代码内部进行许多转换。没关系。
  • 写一个类别以编程方式从情节提要中实例化视图控制器,因此您要做的就是让vc = SomeViewController.create(),其中该方法处理所有详细信息(将情节提要,从情节提要中拉出视图控制器等)。 )。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.