【问题标题】:How is an .xib file translated to a UI element?如何将 .xib 文件转换为 UI 元素?
【发布时间】:2017-02-17 13:31:23
【问题描述】:

据我了解,MainMenu.xib 包含用于为应用程序创建主菜单的 XML。我的问题是,这个文件是如何加载、读取和用于创建主菜单的?谁能帮我理解将 MainMenu.xib 转换为 UI 中实际主菜单的代码的内部工作原理?

这是我目前对这个过程的理解。

  1. MainMenu.xib 被编译成 .nib
  2. .nib 被加载到 UINib 对象中。
  3. 从这里开始,UINib 对象以某种方式用于创建主菜单。

这是我感到困惑的部分。 UINib 对象究竟是如何用于创建主菜单的?

【问题讨论】:

  • 这个问题太宽泛,无法在 StackOverflow 上提问
  • @BarryMichaelDoyle 好的,感谢您的提醒!关于如何使其更具体以使其符合 StackOverflow 准则的任何建议?

标签: cocoa cocoa-touch interface-builder xib


【解决方案1】:

反过来想一想:在内存中,在正在运行的应用程序中,您有一个实时视图层次结构。现在您希望在保存 UI 状态的同时终止程序。你会怎么做?您会以某种方式将实时视图的所有重要属性写入磁盘;某种序列化和归档过程。

这就是 nib 的全部内容:它是一堆碰巧是视图的对象的存档。 (当然,它在任何用户交互之前对视图的“基本”状态进行编码。)正如您正确指出的那样,xib 是该存档的 XML 呈现,这使其与版本控制更好地配合。

如果您在 Xcode 中查看 xib 的 XML,您会发现它由如下条目组成:

<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="161" id="KGk-i7-Jjw" customClass="LeakInfoStepsCell" customModule="LookoutEmailLeakAlert" customModuleProvider="target">
        <rect key="frame" x="0.0" y="0.0" width="320" height="170"/>
        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
...

仅列出视图上的各种属性以及它们在 nib 未归档时应具有的值。因此,当您加载 UINib 时,它会读取这些属性并创建视图对象,就像您在代码中手动执行的操作,或者您通过 NSCoding 为您自己的对象执行的操作一样。

【讨论】:

  • 谢谢!这实际上有很大帮助。我有一个令人毛骨悚然的想法,认为 UINib 类背后有某种“魔法”,但我发现情况并非如此。这很有帮助 - 非常感谢 :)
  • 我承认这是基于推理,实际上并没有看到 UINib 代码,但我不相信其中涉及任何真正的魔法。很高兴我能帮上忙。
  • 这个推理对我来说很有意义!另外,还有一个问题——假设我想在 MainMenu.xib 中阅读并手动创建主菜单(即,在 .xib 中定义我自己的“文件”、“视图”等选项,解析 .xib,然后然后从此 .xib 创建主菜单)。我现在明白了我将如何读取和解析 MainMenu.xib 中的数据,但是您对如何从那里创建主菜单有任何提示吗?
  • 澄清一下,如果我有一个名为 SomeView 的 UIView 子类,并且我正在阅读一个 .xib 文件,该文件描述了作为 SomeView 实例的 UI 元素(我只会解析 .xib 并按照指定创建 SomeView 的实例)。我的问题是关于如何创建主菜单的。主菜单是否也使用 UIView 的子类来表示,还是有什么特别之处?抱歉,如果这是一个糟糕的问题,只是寻找一些提示来为我指明正确的方向! :)
  • OS X 上没有 UIView——有 NSView——而且 iOS 中通常没有“MainMenu”xib,所以我有点困惑你在问什么。但是在 Xcode 为 OS X 项目创建的默认 MainMenu.xib 中,您可以看到一个 menu 对象,它表示 NSMenu 的一个实例,即菜单栏。您将 NSMenuItems 添加到其中,但您可以在代码中或通过 Interface Builder 执行此操作。你不需要重新发明 NSNib。
猜你喜欢
  • 2012-04-21
  • 2021-04-01
  • 2014-04-11
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2016-11-08
相关资源
最近更新 更多