使用情节提要和Xib文件之间的主要区别是什么?
具体来说,使用情节提要的优点或缺点是什么?
不幸的是,尽管进行了大量研究,但我在情节提要板上能够找到的只是简单的教程,向您展示了如何设置情节提要,而没有具体的信息说明其含义。
Answers:
情节提要是:
我已经使用Storyboard已有一段时间了,唯一的缺点是您不能针对iOS 4或更低版本。情节提要仅在运行iOS 5或更高版本的设备上工作。除此之外,这样做的好处是很多的,而国际海事组织则不存在弊端。
我见过的最好的教程是Ray Wenderlich的
另外,如果您是Apple Developer计划的成员,请查看去年在Storyboard(iTunesU)上的WWDC会议,它很棒。
另一个很棒的课程(也在iTunesU上)是最新的斯坦福iOS应用程序编程课程。
情节提要不仅有优点,也有缺点-只是因为您要求输入:
-以下是不正确的: -如果您需要执行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之间来回移动-事情开始变得更糟。
Nibs / .xib文件和Storyboard都是Interface Builder文件,用于在Xcode中直观地为iOS和Mac应用程序创建用户界面(我将使用iOS术语作为类,因为此问题被标记为iOS,但它也适用于Mac编程) 。
笔尖旨在与一个单独使用UIView
。也可以通过将UIViewController
File Owner的类设置为任何子类UIViewController
并将其连接到视图出口(使用Xcode最右侧窗格中的Connections Inspector拖动以进行连接)来将它们连接到子类。
情节提要旨在包含1个或更多用户界面UIViewController
。您可以在单个情节提要中构建整个用户界面,也可以将其分成较小的部分。
应始终使用情节提要板以支持.xib文件/ Nib(用于视图控制器)。故事板具有更多功能,并且由Apple积极开发。
支持Nibs的每个论点都依赖于这样的事实,即故事板包含许多场景时,它们会单独使用。您可以UIViewController
像使用Nibs一样轻松地为每个脚本使用一个情节提要(请参见下面的代码示例)。请继续阅读以获取详细的解释和代码示例。
为什么Storboard优于Nibs?
答案基本上归结为Apple鼓励使用Storyboard,并在其中进行更多开发。
反对情节提要的基本论点是,将所有视图控制器放在一个位置会导致合并冲突,Xcode速度慢,构建时间慢以及维护的麻烦。因此,一般的建议是为每个使用Nib UIViewController
。
但是...您可以为每个创建故事板UIViewController
。一种常见的做法(至少对我来说)是在类方法中隐藏所有UIViewController初始化(因为其他任何类都不需要知道控制器的Nib / 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];
}
故事板
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的论点
论点:如果您的团队中有很多人进行更改,那么拥有一个带有很多视图控制器的情节提要将导致合并冲突。
响应:一个情节提要板引起的合并冲突不会比单个Nib多
论点:非常复杂的应用程序在Storyboard中具有很多场景,这导致了一个巨大的Storyboard,需要永久加载,并且由于其大小而难以理解。
响应:这是一个好点,但是您可以轻松地将情节提要分解成较小的部分。故事板引用看起来像一个很棒的功能,可用于将故事板链接在一起,但仅在Xcode 7 / iOS 9+中可用。同样,仍然不是在Storyboard上选择单个笔尖的理由。
参数:为每个UIViewController
子类创建一个Nib可使您重用代码,因此不必为情节提要中的每个场景设置所有约束和出口。
回应:同样,这不是选择单个Storyboard而不选择单个Nib的理由。
几个月前的LiDG会议上有一个关于Storyboard的不错的演讲。
就个人而言,我会说这是使用新应用程序的方式。仍然存在一些差距,尤其是对于非常复杂的应用程序,但专业人士的缺点多于缺点。
请注意,如果使用Storyboards,则您的应用程序与旧版OS安装不兼容。
优点:
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仓库处理同一个项目时,情节提要中的问题
从某些资源复制
故事板的弊大于利。以下是从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更改UITableViewController
为UICollectionViewController
?还是变成了平原UIViewController
?在情节提要中不可能。您必须删除旧的视图控制器并创建一个新的视图控制器,然后重新连接所有segue。进行这样的代码更改要容易得多。
情节提要向项目增加了两个额外的责任:(1)情节提要编辑器工具,用于生成情节提要XML;以及(2)运行时组件,用于解析XML并从中创建UI和控制器对象。这两个部分都可能包含无法修复的错误。
情节提要不允许您将子视图添加到UIImageView
:谁知道原因。
情节提要不允许您为单个View(-Controller)启用自动布局:通过选中/取消选中情节提要中的“自动布局”选项,所做的更改将应用于情节提要中的所有控制器。(感谢SavaMazăre!)
情节提要具有破坏向后兼容性的更高风险:Xcode有时会更改情节提要的文件格式,并且不以任何方式保证您可以打开几年后甚至几个月后今天创建的情节提要文件。(感谢这一点的思想优势。请参阅原始评论)
这是麦当劳:用乔布斯(Steve Jobs)关于微软的话来说:麦当劳(视频)!
在iOS 7之前的版本中,情节提要非常整洁,但并非必须具备。他们介绍了解决的许多问题。iOS 7使故事板可以达到平衡。
在iOS 8和9上,这不再是一个问题:使用故事板!
情节提要的主要缺点是,您完全依赖XCode,并且可能最终会花费数小时来处理XCode错误。但是XCode变得更好了,并且Storyboard的优点现在太多了,不容忽视。表格视图单元原型,Size类,自动布局支持等。
一些技巧: