如何响应从 xib 加载的自定义视图中发生的操作?

Posted

技术标签:

【中文标题】如何响应从 xib 加载的自定义视图中发生的操作?【英文标题】:How do I respond to actions happening in a custom view loaded from xib? 【发布时间】:2016-02-21 00:26:22 【问题描述】:

我已按照this answer 中的说明创建了一个可重用的自定义 UIView,该 UIView 使用 xib 布局,我可以通过引用自定义类将其嵌入到我的 Storyboard 中。这很好用,我可以成功加载广告中的视图。但是我希望我的嵌入视图控制器能够连接到我的嵌入视图的 IBActions。在链接的示例中,自定义视图接收自己的操作,但这似乎是糟糕的设计。我已经通过创建一个用于自定义视图的委托协议来解决这个问题,该协议将事件转发给它的委托,但这感觉比应该做的工作更多。此外,Interface Builder 不允许我使用 UI 中的引用连接委托,因此我必须以编程方式进行。

我真正想要的是在我的自定义视图中创建一个自定义 IB 操作,例如 someActionHappened,然后将其连接到嵌入视图控制器中。实现这一目标的最佳方法是什么?

【问题讨论】:

Delegate 似乎是一个不错的解决方案。 【参考方案1】:

.xib 文件有一个文件所有者,您可以在编辑它时看到并选择它。

加载笔尖时,您可以指定owner

您可以(并且必须)使这两个东西的类(nib 中的文件所有者和加载时的实际所有者)匹配。

因此,一个动作可以从 nib 中的某物挂钩到 File's Owner 类中的 IBAction,并在 nib 加载时执行。问题解决了。

所以:

但是我希望我的嵌入视图控制器能够连接到我的嵌入视图的 IBActions

因此,您的解决方案是让您的文件所有者(在您的笔尖中)和实际的 owner(在笔尖加载时)成为您的嵌入视图控制器。现在你的嵌入视图控制器被允许有一个 IBAction 并且你可以在 nib 中连接到它。

【讨论】:

如果你想让它与多个视图控制器类一起工作,你可能需要多玩一些协议或超类,但绝对可以做到。

以上是关于如何响应从 xib 加载的自定义视图中发生的操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取从 nib ios 加载的自定义视图的实际大小

在从 XIB 加载的自定义视图中修改 UIButton 的标题标签

从 .xib 加载自定义视图不适合 iPhone 6+

如何在 Objective-C 控制器中以编程方式加载用 swift 编写的自定义 XIB 视图

从外部 xib/nib 文件导入的自定义按钮不响应按钮单击

从 xib 加载 iOS 不起作用