【问题标题】:How to set up @IBAction to target a UIView subclass如何设置@IBAction 以定位 UIView 子类
【发布时间】:2016-06-03 05:15:18
【问题描述】:

我正在尝试一种无情节提要的方法,并尝试了以下方法:

  1. 我创建了一个 FooView.xib 来保存我的布局。它有几个按钮和标签。
  2. 我创建了一个 FooView.swift 来保存 UIView 的 FooView 子类。目前,它并没有真正做任何事情。
  3. 我创建了 FooViewController.swift 来管理我的 FooView 实例。我调用它来创建FooViews如下:

    初始化(){ super.init(nibName:“FooView”,捆绑:无) }

  4. 我将 FooView.xib 的 File Owner 设置为 FooView 类

  5. 我将FooView视图的自定义类设置为FooView
  6. 我将一些 @IBAction 输出从 IB 拖到 FooView 实现中

当我的操作触发时,我得到一个运行时异常:“无法识别的选择器发送到实例”,它引用了 FooViewController(!)。我仔细检查了文件所有者和所有输出,所有引用看起来都正确。

它的行为就像它忽略了关于事件调度的文件所有者。

(感觉就像我在与框架作斗争,并且真的希望在控制器内实现我的所有输出/操作,但从架构纯度的角度来看(以增强测试),我倾向于隐藏 xib 控制细节并制作一个更不透明的视图,它不直接将其内部控件暴露给控制器,而是具有协议/委托类型的合同。)

我有一个偷偷摸摸的怀疑,如果我将所有 xib 加载逻辑移到 UIView 实现中,事情就会起作用,但这感觉就像一次更大的冒险。有没有一种简单的方法来设置我的 FooView 子类来接收事件?

【问题讨论】:

  • 所有者应该是FooViewController类,而不是FooView。似乎您对什么是视图和什么是控制器没有明确的区别。请向我们展示真正的初始化代码。
  • 虽然您可以从 nibs 加载 UIView,但您可以通过 init 方法来实现 - 这是针对 UIViewControllers 的。您可以加载 NIB 文件,然后提取根视图对象。这个答案显示了 Objective C 中的内容。翻译为 Swift 非常简单 - stackoverflow.com/questions/15405916/… 但实际上,我认为您误解了视图控制器中应该是什么以及 UIView 中应该是什么。
  • 很确定我理解视图和控制器之间的区别。我看不出为什么视图不能在不将其委托给控制器的情况下自行管理其子级的详细信息(即字段设置、事件处理)。我实际上认为典型的 iOS 实现具有混乱的职责。控制器应该是一个中介,就像通常应该有一个与模型对话的协议一样,通常(在其他框架中,无论如何)也应该有一个与视图对话的协议。我要做的就是从控制器中抽象出视图细节。

标签: ios xcode swift uiview uiviewcontroller


【解决方案1】:

您可以使用的另一件事是将 First Responder 设置为您的行动目标。尽管您不会在 XCode 中获得 IBAction 已连接的漂亮整洁指示符,但它会将消息传递给实现该方法的响应者链中的第一个类。

要在界面生成器中进行设置,请单击 First Responder 并打开属性检查器。将您的方法作为someAction: 添加到用户定义列表中(不要忘记冒号)。然后,您可以将按钮连接到第一响应者,该方法将是您连接它的可用选项。

最后,您像平常一样在要实现的视图类中声明您的 IBAction。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多