将 Interface Builder 设置转换为 Objective-C

Translating Interface Builder settings into Objective-C

为了理解 Interface Builder 的逻辑,拥有一个工具会很有用,该工具需要在 IB 的帮助下创建的 xcode 项目 (cocoa/objc) 并生成"equivalent" 所有(或部分)IB 设置已转换为目标代码的项目。

有这样的工具吗?

Does such a tool exist?

据我所知还没有。

it would be useful to have a tool which takes an xcode project (cocoa/objc) created with the help of the IB and produces an "equivalent" project where all (or some of the) IB settings have been translated into objc code.

它可能没有您想象的那么有用。您真的不需要非常详细地了解 Interface Builder "the logic",您只需要了解它做什么和不做什么。

Xcode 中我们仍称为 Interface Builder 的部分(即使它作为独立应用程序的时间不超过某些 Xcode 用户的存在时间)本质上只是创建对象,配置它们,将它们连接在一起,并将生成的对象图序列化到一个文件中。它不会*生成任何代码,也不会做任何神奇的事情。当您的应用程序运行时,故事板或 xib 文件的内容将被读取并反序列化以创建一个与您在 IB 中指定的对象图相匹配的对象图。

如果您想查看 IB 创建的对象是如何配置的,您可以查看 xib 或故事板文件,或者您可以检查程序中的对象。序列化文件大多只是调出对象和它们之间的关系。这是来自 xib 文件的标签:

<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Apple" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HDj-93-0Hv">
    <rect key="frame" x="59" y="114" width="45" height="21"/>
    <fontDescription key="fontDescription" type="system" pointSize="17"/>
    <nil key="textColor"/>
    <nil key="highlightedColor"/>
</label>

关于标签本身的所有信息都在那里,不需要太多的思考就可以了解如何编写 Objective-C 或 Swift 创建标签和配置的代码它以同样的方式。可能最难的部分是检查与其他对象的关系,例如自动布局约束。为此,请查看上面的 id 字段:

id="HDj-93-0Hv"

该 ID 是其他对象的 link。这是一个限制条件:

<constraint firstItem="HDj-93-0Hv" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" constant="70" id="rM0-in-vEv"/>

这只是另一个对象规范,但由于约束必须引用其他对象,因此您会看到其中包含一些 ID。有上面指定的标签的 ID,以及封闭视图的 ID,还有约束本身的 ID。

另一种方法是查看应用程序中的对象。您可以在调试器中查看对象的属性,查看它们所连接的对象,打印出它们的约束等。使用视图层次结构工具可以很好地了解视图的排列方式。

我敢肯定这听起来像是通过 XML 进行选择或使用调试器会变得复杂,如果您有一个包含大量视图和它们之间的大量关系的大型故事板,并且您没有错。但是,如果您有一个工具可以将故事板转换为 Objective-C 或 Swift 代码,那么生成的代码就不会那么复杂。


*整个 "it doesn't generate code" 想法与 SwiftUI 相比 window,因为当你工作时框架的声明式风格 Xcode 将图形视图布局映射到您的代码。