以编程方式创建视图和添加子视图比使用情节提要更好/更快[重复]

Posted

技术标签:

【中文标题】以编程方式创建视图和添加子视图比使用情节提要更好/更快[重复]【英文标题】:it's better/faster making a view and add subviews programatically than using a storyboard [duplicate] 【发布时间】:2016-09-14 13:55:39 【问题描述】:

以编程方式添加视图和子视图是否比使用情节提要添加它们更有效?

最佳实践是什么?最佳做法是否取决于具体情况?如果是这样,什么时候使用一种方法优于另一种方法?

【问题讨论】:

【参考方案1】:

Storyboard vs Code 出现了很多。而且我认为将其视为更好通常会引发激烈的战争。因此,我将列出每种方法的优缺点,希望您可以做出明智的决定。

这绝不是一份详尽的清单。我希望看到编辑或 cmets 添加额外的要点。

故事板专家

故事板非常适合让概念快速发挥作用。 它们非常适合查看您的实际应用并在多个设备上进行预览。 它们使自定义外观和探索可能性变得非常容易。 它们非常适合初学者,因为它们消除了一个障碍,让您专注于应用程序的代码,而不是一些样板 UI。

故事板缺点

故事板和 Xib 不适合合并。阅读 XML 并就合并冲突做出决定是可能的,但肯定不愉快。 当您自定义应用程序并构建使其与众不同的自定义部分时,Storyboards 无法跟上。这意味着,在设备上看到和预览应用的好处会慢慢失去其价值,因为越来越多的应用是在必要时用代码完成的。 Storyboards 对实际用户的性能影响不大,但即使在最快的机器上,它们也肯定会减慢 Xcode。 您无法像在代码中那样自定义 Interface Builder 中的所有内容,因此不可避免地需要一些代码和一些 Storyboard 自定义。稍后当您想要更改某些内容时,您必须检查至少两个地方才能找到正确的更改位置。 如果您在整个应用程序中使用相同的字体和颜色,则可以轻松地在一处更改代码。在 Storyboard 中,您需要为您设置的每个标签或视图更改它。您可以在代码中轻松设置字体和颜色,同时将 Storyboard 用于您的其余布局,但随着时间的推移,您会发​​现您的 Storyboard 越来越少地代表您的实际应用。 虽然可以在 Storyboard 中进行像素完美的设计,但拖放并不像输入特定数字那样精确。 Storyboard 确实支持输入这些数字,但您需要导航到多个位置,如果稍后拖动它,数字都会全部重置。 重用视图通常涉及复制和粘贴它们。当您需要进行更改时,这些会导致问题。 在特定时间显示和隐藏视图是可行的,但与实际应用相比,您的情节提要再次处于不切实际的状态。

程序化专家

您的所有代码都在一个地方,便于以后调试或更改。 子类和自定义属性与第一类视图和属性没有什么不同。您的自定义设置将易于管理。 在整个应用中重复使用的视图只需创建一次。 合并冲突通常很容易理解和做出决定。 依赖注入是实例化 UIViewController 并确保传入必要信息的最安全方法之一,而 Storyboard 无法实现这一点,从而导致代码不那么直接且更容易出错。

程序化缺点

额外的复杂性可能是初学者的绊脚石。 编写几行代码可能比点击几个复选框花费更长的时间。 使用布局时,您需要在脑海中将其可视化或运行您的应用程序以查看您的布局在您进行更改时的样子。对于某些人来说,这可能很困难或速度较慢。 Storyboard 为许多可自定义的属性(如背景颜色、字体等)公开了复选框和按钮。这使您可以轻松一目了然地看到您可以自定义的内容。 (尽管如上所述,它并不是全部)在代码中,您需要查看文档或标题以了解您可以自定义的内容。

【讨论】:

大部分情节提要的缺点只有在您没有正确使用情节提要时才有效。仅当您制作巨大的故事板时,故事板才会减慢 xcode 的速度,这绝对是不正确的。实际上,您可以自定义情节提要中的所有内容,也可以设置自定义类、可设计对象等。通过复制视图重用视图并不是您能做的最好的事情。合并实际上是在使用小型故事板时唯一可以大大减少的大问题,因为两个人修改同一个 xib/storyboard 的可能性已降至最低。 对于复杂的布局,在代码中正确设置约束需要花费大量时间,考虑到您没有验证,您看不到缺少的约束,并且您无法轻松切换到不同的大小类。理解代码很重要,但布局工作必须在 xibs/storyboards 中。 大型故事板并不是降低 Xcode 速度的唯一方法。 Designable 需要编译,这会极大地影响即使是中型应用程序的 Storyboard 性能。设置自定义类可确保您获得正确的对象,但您的故事板与该类完全不匹配。重用视图有更好的方法,但据我所知都需要代码。 在代码中设置约束对我来说通常更快,因为您需要的更少而且它们可以更精确。但这可能只是我的经验水平(代码经验丰富,故事板经验较少)。但是,我认为这是一个客观事实,事后更改这些约束在代码中总是更快、更安全。因此,也许应该将其视为对未来使用代码的投资。将故事板视为专业人士的宝贵捷径。 编译可以更快完成,例如通过将您的设计对象移动到一个单独的目标。我的故事板零性能问题,我在笔记本电脑上工作。考虑到 Interface Builder 总是验证您的约束,代码中的约束绝对没有什么更安全的了。没有什么比它更快了。在代码中更改一个数字和在 IB 中更改一个数字需要相同的时间。也许在 IB 中找到正确的约束将比在代码中找到正确的约束花费更少的时间。代码中的约束并不比 IB 中的约束更精确,它们具有相同的选项。

以上是关于以编程方式创建视图和添加子视图比使用情节提要更好/更快[重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法以编程方式将视图添加到情节提要中的现有子视图

如何以编程方式为情节提要中的子视图设置视图控制器?

iOS:如何以编程方式将视图添加到情节提要视图

对于 iOS,我可以混合和匹配以编程方式添加视图并同时使用情节提要吗?

以编程方式将视图添加到情节提要

以编程方式添加的视图对象未显示在情节提要中