【问题标题】:Should or should not use nib files ?应该还是不应该使用 nib 文件?
【发布时间】:2012-02-10 10:50:58
【问题描述】:

我是 iOS 开发新手。我已经阅读了一些我在网上找到的源代码,其中很多不包含单个 nib 文件。所有的视图似乎都是从代码中手动绘制的。

拥有/不拥有 nib 文件有什么好处?为什么他们选择从代码创建所有内容,而不是您可以可视化的东西,例如故事板或 *.xib 文件?

【问题讨论】:

  • 不要忘记:“Storyboards 在 iOS 5 及更高版本中受支持,并且默认为新项目启用。但是,如果您的应用程序必须在早期版本的 iOS 上运行,则不能使用 Storyboard 和应该继续使用 nib 文件。” (iOS 应用程序编程指南 ©Apple Inc)。

标签: ios storyboard xib nib


【解决方案1】:

我喜欢代码的最大原因是它在源代码管理中的差异很大。 XIB 很难区分、合并和阅读。

复制/粘贴保存的 sn-ps 代码也很容易。使用 IB,我总是忘记一些复选框,这让我想知道为什么魔法不起作用。我的笔记有代码sn-ps。

IB 真正擅长的是布局和帮助您制定人机界面指南(控件之间的像素数等...使用指南)。

所以,我个人的偏好是 IB 中的布局以及代码中的所有其他内容(包括目标、操作、添加列等...等...)。不过,在动态场景下,IB 会崩溃,您最终会得到自定义视图。

这是一个相关的帖子:

Interface Builder (XIB) or Code when merging in a team environment?

【讨论】:

    【解决方案2】:

    关于为什么应该使用笔尖和不应该使用笔尖的原因有很多。没有确定的答案,每个答案都取决于您需要做什么。

    除了 Nib 提供的明显优势(快速的 UI 创建过程、最小化 .m 文件中的视图构建代码)之外,它们还提供了您无法找到的任何其他方式:解决本地化问题。在将您的应用程序本地化为其他语言时,您会偶然发现需要 2-3 个词来解释的短语和事物,而在另一种语言中它们只需要一个词。当使用不同的本地化时,这会严重导致视图控制器内的错位视图错误。因此,您可以在 Xcode 4 中为每个 nib 设置 2-3 个子 nib,并按照您喜欢的方式对每个 nib 进行本地化,并将按钮和视图放置在正确的位置,而不必担心根据语言重新定位视图用户有。如果你要使用代码来做这一切,你应该在任何地方都放置'if',这肯定是一种糟糕的编程习惯,而且容易出错。

    如果我不使用界面生成器,我创建了一些视图控制器,这些控制器需要数百行来设置视图。

    但是,NIB 永远无法实现以编程方式创建视图的性能,因为每个 NIB 都是用 HTML/XML 编写的视图描述符,并且在创建任何视图之前,必须从磁盘读取文件并进行分析。 Nibs 也缺少普通代码所具有的自定义选项(阴影、圆角和其他 Quartz 魔法)。这些自定义选项不可用,因为有很多方法可以使用代码实现相同的结果,或者通过与更高级别的核心动画层对话,或者通过直接寻址 QuartCore 和 CGGraphics 并在那里执行繁重的工作,这在大多数情况下肯定更快并且推荐情况(使用图层的阴影可能非常慢)。因此,Apple 不希望将开发限制为特定的绘图方式。

    NIB 的存在是有原因的。您必须确保在您的应用程序中了解创建 NIB 的原因。 Nib 的存在是为了将代码连接到插座、促进本地化、加速开发和清理代码。在项目中,您当然必须使用 Nib,但您也必须避免使用它们,因为纯代码也可以通过最少或类似的工作获得相同的结果。

    最后但同样重要的是,考虑内存管理。使用 Nib 会影响分配对象(如 IBOutlets)的释放。如果您确定您创建的 IBOutlet 将在您需要时被释放,请不要使用 NIB。请改用普通代码。

    【讨论】:

      【解决方案3】:

      在代码中创建视图的原因有很多。

      • nib 文件是延迟加载的,有时会导致用户不喜欢的明显缺乏反应
      • 您无法在 IB 中配置所有内容,并且很多视图需要一些花哨的附加功能
      • 有时只写下您的视图比单击并拖动所有需要的东西更容易
      • ...

      我认为最重要的原因是缺乏性能和功能。

      当我只想通过简单的按钮和标签显示简单的信息以及用于原型设计时,我正在使用 nib 文件。

      【讨论】:

        【解决方案4】:

        有非常简单的 nib,例如典型的 MainWindow.nib,它们没有本地化内容,并且可以用一行代码复制。在这种情况下,代码比解压 nib 快得多。

        还有一些无法用笔尖来描述的高度动态的布局。

        您应该在每种特定情况下选择最方便和最有效的方式。总会有取舍,只要明智地选择。

        【讨论】:

          【解决方案5】:

          nib 文件是一种特殊类型的资源文件,用于 iOS 和 Mac 应用程序的用户界面。 nib 文件是一个 Interface Builder 文档。您使用 Interface Builder 来设计应用程序的可视部分(例如窗口和视图),有时还用于配置非可视对象,例如您的应用程序用来管理其窗口和视图的控制器对象。实际上,当您编辑 Interface Builder 文档时,您会创建一个对象图,然后在保存文件时将其存档。加载文件时,对象图未归档。

          nib 文件(以及对象图)可能包含占位符对象,这些对象用于引用文档之外的对象,但这些对象可能引用了文档中的对象,或者文档中的对象可能具有参考。一个特殊的占位符是文件的所有者。

          在运行时,您使用方法 loadNibNamed:owner: 或其变体加载 nib 文件。 File’s Owner 是 nib 文件中作为该方法的 owner 参数传递的对象的占位符。当您在运行时加载文件时,无论您在 Interface Builder 的 nib 文件中建立的与文件所有者之间的任何连接,都会重新建立。

          iOS 使用 nib 作为支持故事板(iOS 用户界面设计布局格式)的实现细节。故事板允许您在一个画布上设计和可视化应用程序的整个用户界面。对于 iOS 开发人员,推荐使用故事板来设计用户界面。

          【讨论】:

            【解决方案6】:

            我将从 xibs 开始。一旦你完成了 UI,然后将你的 xib 迁移到代码中。这样,您就可以两全其美。 XIB 可能很慢,我见过 400KB 的 XIBS(虽然有点少)。不过,XIB 肯定很笨拙……

            【讨论】:

              猜你喜欢
              • 2011-01-13
              • 1970-01-01
              • 2011-08-29
              • 1970-01-01
              • 2015-07-26
              • 2020-12-17
              • 1970-01-01
              • 1970-01-01
              • 2012-08-14
              相关资源
              最近更新 更多