2015-12-21 117 views
1

我最近开始学习iOS开发,并喜欢使用Xcode的界面构建器。这很容易添加赛格和插座和“事件处理程序”thingys(抱歉,我不知道他们叫什么)。当我在Xcode的界面生成器中做些什么时,幕后会发生什么?

不过,我弄糊涂了,当我添加标签或某事的出口,并认为这获取代码

@IBOutlet var weak myLabel: UILabel! 

加入我看不到任何分配给变量!而当我使用这个变量时,它不是nil!当我在用C#做Windows窗体时,每当我在界面设计器中添加一些东西时,就会在一个单独的文件中生成一些代码来实际“添加”这个东西。

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

因此,我推断必须有一些代码在幕后生成,这些代码反映了我的代码并为outlet变量赋值。我在哪里可以找到这个文件?究竟添加了什么?或者我的猜测是错误的?

+0

可以作为源代码打开相同的XIB或故事板文件。在左侧的File View中右键单击它并选择Open As> Source Code。 – hannad

+0

在Storyboard中点击你的标签和实用程序(xcode中的右侧面板) - >属性检查器,你可以看到标签的所有默认设置。您可以在此处或通过myLabel插座在代码中进行更改。 –

+0

@F_Boris我知道这一点。我不知道的是变量如何分配,我看不到任何分配。 – Sweeper

回答

2

的.storyboard文件里面,您所创建的网点都坚持像这样:

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

property键值对引用它连接到变量的名称。 KVP指向您所连接的故事板中的元素。

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

Mac Developer Library: The Nib Object Life Cycle

至于存在编译NIB文件,其中,你可以看到他们在你的build文件夹(发现矿DerivedData/<YourBuildFolder>/Build/Products/Debug-iphoneos/<YourProjectName>/)。从故事板生成的人可以在Base.lproj文件夹中找到。

+0

为什么故事板叫做XIB文件?他们不是'.storyboard'文件吗?这是我需要寻找的另一个文件吗? – Sweeper

+0

我不应该在我的答案中包含对XIB的引用。 .XIB文件是在Interface Builder中创建单个视图时创建的,而Storyboard则是多个视图,Seglog和其他对象的集合。最后,故事板中的每个视图都会被编译为NIB文件。要查看这些内容,请查看DerivedData//Build/Products/Debug-iphoneos/ /Main.storyboardc包内部。我会更新我的答案,以便更清楚一点。 – kleezy