我正在从头开始一个新项目,虽然到目前为止我也一直在以编程方式创建和处理视图和视图控制器(不时有一些 xib,对于一些简单的视图),但我现在想知道是否是时候切换到故事板。看起来 Apple 正在努力推动他们,也许我不应该与他们抗争并接受新方法?(不是很新,但也许现在成熟了?)
3 回答
优点:您可以真正看到您的应用程序以及应用程序之间的连接。如果您有一些不需要逻辑的 UI(例如带有一些静态文本的服务条款和带您进入下一个屏幕的同意按钮),您甚至不需要创建其中的控制器部分。
缺点:如果您在一个大团队中,使用版本控制时故事板可能很难合并。
几乎只有缺点。这是他们的问题列表,从iraycd复制:
故事板在运行时失败,而不是在编译时:您的 segue 名称有错字或在故事板中连接错误?它会在运行时爆炸。您使用了故事板中不再存在的自定义 UIViewController 子类?它会在运行时爆炸。如果您在代码中执行此类操作,您将在编译时及早发现它们。更新:我的新工具StoryboardLint主要解决了这个问题。
故事板很快就会变得混乱:随着项目的增长,您的故事板变得越来越难以导航。此外,如果多个视图控制器对多个其他视图控制器有多个 segue,您的故事板很快就会开始看起来像一碗意大利面,您会发现自己放大和缩小并到处滚动以找到您正在寻找的视图控制器并找出 segue 指向的位置。更新:这个问题主要可以通过将故事板拆分为多个故事板来解决,如Pilky的这篇文章和 Robert Brown的这篇文章中所述。
故事板使团队工作更加困难:因为您的项目通常只有一个巨大的故事板文件,所以让多个开发人员定期对一个文件进行更改可能会让人头疼:需要合并更改并解决冲突。当发生冲突时,很难说如何解决它:Xcode 生成故事板 XML 文件,它的设计并没有真正考虑到人类必须阅读的目标,更不用说编辑它了。
故事板使代码审查变得困难或几乎不可能:同行代码审查对您的团队来说是一件好事。但是,当您对情节提要进行更改时,几乎不可能与其他开发人员一起查看这些更改。你所能得到的只是一个巨大的 XML 文件的差异。破译真正改变了什么以及这些改变是否正确或者它们是否破坏了某些东西真的很难。
故事板阻碍代码重用:在我的 iOS 项目中,我通常会创建一个类,其中包含我在整个应用程序中使用的所有颜色、字体、边距和插图,以使其具有一致的外观和感觉:如果必须的话,只需进行一行更改调整整个应用程序的任何这些值。如果您在情节提要中设置此类值,则会复制它们,并且在您想要更改它们时需要找到每一个出现的地方。您错过一个的机会很高,因为情节提要中没有搜索和替换。
故事板让你做任何事情两次:你是否正在构建一个在 iPad 和 iPhone 上运行的通用应用程序?当您使用故事板时,通常会有一个用于 iPad 版本的故事板和一个用于 iPhone 版本的故事板。保持两者同步需要您在两个地方进行每个 UI 或应用程序工作流更改。耶。更新:在 iOS 8 和 Xcode 6 中,您可以为 iPhone 和 iPad 使用单个 Storyboard。
故事板需要不断的上下文切换:我发现自己在代码中的工作和导航速度比在故事板中快得多。当您的应用程序使用故事板时,您会不断切换上下文:“哦,我想点击这个表格视图单元以加载不同的视图控制器。我现在必须打开故事板,找到正确的视图控制器,创建一个新的 segue到另一个视图控制器(我也必须找到),给 segue 一个名字,记住这个名字(我不能在故事板中使用常量或变量),切换回代码,希望我不要打错名字我的 prepareForSegue 方法的那个 segue。我多么希望我可以在我所在的地方输入这 3 行代码!不,这不好玩。在代码和情节提要(以及键盘和鼠标)之间切换会很快变老并减慢您的速度。
故事板很难重构:当您重构代码时,您必须确保它仍然符合您的故事板所期望的。当您在情节提要中移动内容时,您只会在运行时发现它是否仍然适用于您的代码。我觉得好像我必须让两个世界保持同步。在我的拙见中,它感觉很脆弱并且不鼓励改变。
Storyboards are not searchable:当您使用 Storyboards 时,Xcode 中的项目范围搜索并不是真正的项目范围搜索。它们不包括在搜索中。因此,当您从代码中删除自定义类或重命名它时,您将不得不手动浏览情节提要或查看其原始 XML 以确保它与您的代码更改一致。不,先生,我不喜欢它。更新:故事板在 Xcode 6 中是可搜索的。
故事板不太灵活:在代码中,您基本上可以做任何您想做的事情!使用情节提要,您仅限于在代码中可以做的事情的一个子集。尤其是当你想用动画和过渡做一些高级的事情时,你会发现自己“与故事板作斗争”以使其工作。
故事板不允许您更改特殊视图控制器的类型:您想将 a 更改
UITableViewController
为 aUICollectionViewController
吗?还是变成平原UIViewController
?在情节提要中不可能。您必须删除旧视图控制器并创建一个新视图控制器并重新连接所有 segue。在代码中进行这样的更改要容易得多。Storyboards 为您的项目增加了两个额外的负担:(1) Storyboard Editor 工具生成 Storyboard XML 和 (2) 解析 XML 并从中创建 UI 和控制器对象的运行时组件。这两个部分都可能存在您无法修复的错误。
故事板不允许您将子视图添加到
UIImageView
:谁知道为什么。Storyboards 不允许您为单个 View(-Controller)s 启用 Auto Layout:通过选中/取消选中 Storyboard 中的 Auto Layout 选项,更改将应用于 Storyboard 中的所有控制器。(感谢 Sava Mazăre 的这一点!)
Storyboard 破坏向后兼容性的风险更高:Xcode 有时会更改 Storyboard 文件格式,并且不能以任何方式保证您能够在几年甚至几个月后打开您今天创建的 Storyboard 文件。(感谢这一点的思想进步。请参阅原始评论)
这是麦当劳:用史蒂夫乔布斯关于微软的话来说:这是麦当劳(视频)!
UIStoryboards 独有的另一款 Pro:静态表格视图单元格。根据 Apple 的说法,“对于静态内容,行数是在编译时已知的有限数量。呈现项目详细视图的表格视图是静态内容的良好候选者。”