将界面生成器设置转换为Objective-C

将界面生成器设置转换为Objective-C,objective-c,xcode,cocoa,interface-builder,Objective C,Xcode,Cocoa,Interface Builder,为了理解Interface Builder的逻辑,最好有一个工具,它接受在IB帮助下创建的xcode项目(cocoa/objc),并生成一个“等效”项目,其中所有(或部分)IB设置都已转换为objc代码 有这样的工具吗 有这样的工具吗 据我所知不是这样 拥有一个接受xcode项目的工具会很有用 (cocoa/objc)在IB的帮助下创建并产生 “等效”项目,其中所有(或部分)IB设置 已翻译成objc代码 这可能不会像你想象的那么有帮助。您不需要非常详细地理解Interface Builder的

为了理解Interface Builder的逻辑,最好有一个工具,它接受在IB帮助下创建的xcode项目(cocoa/objc),并生成一个“等效”项目,其中所有(或部分)IB设置都已转换为objc代码

有这样的工具吗

有这样的工具吗

据我所知不是这样

拥有一个接受xcode项目的工具会很有用 (cocoa/objc)在IB的帮助下创建并产生 “等效”项目,其中所有(或部分)IB设置 已翻译成objc代码

这可能不会像你想象的那么有帮助。您不需要非常详细地理解Interface Builder的“逻辑”,您只需要了解它做什么和不做什么

我们仍然称之为Interface Builder的Xcode部分(即使它不是一个独立的应用程序的时间比某些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>
该ID是指向其他对象的链接。这里有一个限制:

<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代码,那么生成的代码就不会那么复杂了



*整个“它不生成代码”的想法在SwiftUI中消失了,因为当您使用该框架的声明式样式时,Xcode会将图形视图布局映射到您的代码。

“它不生成任何代码”,在某种程度上是这样的。我的意思是,如果你在IB中设计一个具有特定框架和特定字体的UILabel,那么在运行时,需要有人创建一个UILabel并将其分配给该框架和该字体(并将其放在同一个superview中)。这是一种代码生成。换句话说,在非常真实的意义上,nib由指令组成,并且在运行时,这些指令被遵守。因此OP请求这些指令并非完全不合理。实际上,OP的想法与PaintCode没有太大区别,PaintCode允许您对绘制的图像执行所描述的那种操作,即生成生成相同图像的代码指令。类似地,Zeplin允许您设计UILabel标签,并提供生成该标签的代码。@matt您将代码和数据混为一谈。当然,您可以将故事板文件中的XML称为“代码”,但这里的重要思想是IB在任何时候都不会发出任何Objective-C或Swift代码;XML文件中的信息实际上是序列化对象。重要的原因是,许多其他GUI工具确实生成源代码而不是序列化对象,来自其他环境的人或只是对IB的工作原理做出假设的人会感到困惑,直到有人解释它。是的,我认为我们有广泛的共识。我希望我们的评论能够保留下来,因为它们为您的答案提供了一个有用的脚注。我也同意您的观点,即使用代码而不是罐装对象是有好处的,这当然是SwiftUI的部分动机。干杯,谢谢你长久以来的伟大回答。
<constraint firstItem="HDj-93-0Hv" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" constant="70" id="rM0-in-vEv"/>