当我在 Xcode 的界面生成器中执行某些操作时,幕后会发生什么?

What happens behind the scenes when I do something in the interface builder of Xcode?

我最近开始学习 iOS 开发并且非常喜欢使用 Xcode 的界面生成器。添加 segues 和 outlets 以及 "event handler" thingys 非常容易(抱歉我不知道它们叫什么)。

但是,当我添加标签或其他东西的出口并看到它被添加到代码中时,我感到困惑

@IBOutlet var weak myLabel: UILabel!

我没有看到对变量的任何赋值!当我使用变量时,它不是 nil!

那时我用 C# 做 Windows 表单时,每当我在界面设计器中添加一些东西时,一些代码就会在一个单独的文件中生成,以实际 "add" 东西。

我知道故事板文件只是 xml 文件。每当我对它做些什么时,xml 就会改变。但我不相信 xml 可以通过反射为我的变量赋值,可以吗?

所以我推断一定有一些幕后生成的代码反映了我的代码并为出口变量赋值。我在哪里可以找到这个文件?具体添加了什么?还是我猜错了?

在 .storyboard 文件中,您创建的 outlet 是这样保存的:

<connections>
    <outlet property="myLabel" destination="PM2-8V-67p" id="yvq-yW-6rD"/>
</connections>

property 键值对引用它所附加的变量的名称。 destination KVP 指向故事板中它所附加的元素。

是的,故事板很简单 XML,但是当您构建项目时,它们会像任何其他源代码一样被编译,特别是编译成已编译的 NIB 文件。您会在故事板中为每个视图找到一个已编译的 NIB 文件。然后,当您加载视图时,它会将适当的已编译 NIB 加载到内存中,创建您在故事板中为其创建表示的实际对象,并使用 setValue:forKey: 访问器方法将您的插座属性连接到这些对象( iOS)。您可以在此处找到有关整个 NIB 生命周期的更多信息:

Mac Developer Library: The Nib Object Life Cycle

就已编译的 NIB 文件所在的位置而言,您可以在构建文件夹中看到它们(在 DerivedData/<YourBuildFolder>/Build/Products/Debug-iphoneos/<YourProjectName>/ 中找到我的)。从故事板生成的可以在 Base.lproj 文件夹中找到。