加载 NIB 并重新建立连接

Posted

技术标签:

【中文标题】加载 NIB 并重新建立连接【英文标题】:Loading NIB and reestablishing connections 【发布时间】:2011-04-07 09:50:35 【问题描述】:

nib 加载代码如何在实例化对象后建立与 outlet 的连接?

Apple 文档说:

一旦所有对象都被实例化并从存档中初始化,nib 加载代码会尝试重新建立每个对象的出口和相应的目标对象之间的连接。如果您的自定义对象有出口,NSNIb 对象会尝试重新建立您在 Interface Builder 中创建的任何连接。它首先尝试使用对象自己的方法建立连接。对于每个需要连接的出口,NSNib 对象会在您的对象中查找形式为 setOutletName: 的方法。如果该方法存在,则 NSNib 对象将调用它,并将 目标对象 作为参数传递。 ...

但是它是如何确定目标对象的呢?

例如我有一个对象

@interface Foo: NSObject

IBOutlet NSButton *redButton;


...

@end

和redButton通过IB与窗口上的按钮相连。 nib 加载代码如何建立连接?

nib文件中是否有“连接数据”?

【问题讨论】:

【参考方案1】:

是的,当然 NIB 文件必须存储这些连接。如果你在文本编辑器中打开一个 XIB 文件,你会发现每个出口连接的 sn-ps 都是这样的:

<object class="IBConnectionRecord">
    <object class="IBOutletConnection" key="connection">
        <string key="label">launchAtLoginCheckBox</string>
        <reference key="source" ref="1001"/>
        <reference key="destination" ref="951818764"/>
    </object>
    <int key="connectionID">72</int>
</object>

所以看起来 Apple 使用私有类 IBConnectionRecordIBOutletConnection 的实例来建模连接。

【讨论】:

是的,但是如果窗口中有2个按钮并且其中一个与插座相连,那么加载代码如何确定插座redButton在加载笔尖时与窗口中的某个按钮相连? 抱歉造成误会。我重写了我的答案。

以上是关于加载 NIB 并重新建立连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 nib 中的视图重新加载 UIView 属性

在运行时重新加载自定义 UITableViewCell 的 Nib

如何重新加载 UIView?

MonoTouch - 无法在包中加载 NIB:“NSBundle”

从 Nib 加载的 UIView,手动调用 autolayout

在运行时更改连接字符串并重新加载 app.config