为啥我必须在自定义 NIB / XIB 中连接 IBOutlet 两次?

Posted

技术标签:

【中文标题】为啥我必须在自定义 NIB / XIB 中连接 IBOutlet 两次?【英文标题】:Why must I hookup an IBOutlet twice in a custom NIB / XIB?为什么我必须在自定义 NIB / XIB 中连接 IBOutlet 两次? 【发布时间】:2011-02-01 16:34:21 【问题描述】:

我创建了一个自定义的 myViewController 类,它具有默认的 view,以及子视图的 IBOutlet (topleftView)。

我创建了一个自定义 NIB/XIB 文件来加载这个 myViewController.xib。在 XIB 文件中,我将文件所有者设置为 myViewController,并将 UIViewController 身份类设置为 myViewController。

我的问题是为什么我必须连接并从子视图中的 IBOutlet 向 both 文件所有者和界面构建器中的 UIViewController 进行引用?

我只是想弄清楚它,因为这是我第一次创建自定义 NIB/XIB。我通常只是在 MainWindow 中完成所有操作,但我的应用程序变得太大,所以我想将它们分散开来。

如果我在同一个 nib 文件中没有一个 IBOutlet 到 UIViewController 和文件所有者的多个连接,我会因 _EXC_BAD_ACCESS_ 错误而崩溃。

【问题讨论】:

【参考方案1】:

"在 XIB 文件中我设置了 文件所有者到 myViewController ..."

我不确定你在这里做什么。我认为这就是问题所在。您的 XIB 顶层有多少项目?它应该只是文件的所有者、第一响应者和视图。如果这里有另一个控制器对象,那就是你的问题。摆脱它。

"...并设置 UIViewController 身份类 myViewController 也一样”

这部分是正确的。要将您的自定义 UIViewController 连接到 XIB,请在“文件所有者”上计时,转到“身份检查器”,然后在“类”字段的“类身份”下查看。将此设置为“myViewController”(或您命名的任何名称)。

此时,您应该从文件所有者处为您设置的每个插座执行 1 次 ctrl-drag。

【讨论】:

谢谢。这是我的问题,也是我遇到 EXC_BAD_ACCESS 问题的原因。所以如果我有一个自定义视图控制器类,我所要做的就是在类身份检查器中将它设置为文件所有者?我想我还必须在 XIB 中拥有 UIViewCONtroller 对象和它下面的 UIView。在XIB中删除控制器并按照您所说的将UIView留在那里后,一切正常!【参考方案2】:

我的问题是为什么我要上钩 起来并从 子视图中的 IBOutlet 文件所有者和 UIViewController 在 界面生成器?

简短的回答:你不知道。只需将文件所有者的类设置为 UIViewController 子类的类名即可。

【讨论】:

以上是关于为啥我必须在自定义 NIB / XIB 中连接 IBOutlet 两次?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 在 Xcode 6 中使用 xib 在自定义 uiview 中获取 SIGABRT

为啥这段代码不能加载我的 NIB/XIB

从 Nib 加载 NSView 的多个实例

如何让 .xib 出现在自定义类中

从 nib 文件在自定义视图中设置自定义委托

自定义 UITableViewCell 打开不同的 xib 子视图