如何设置@IBAction以定位UIView子类

时间:2016-02-21 21:39:45

标签: ios xcode swift uiview uiviewcontroller

我尝试了无故事板的方法,并尝试了以下方法:

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

    init(){     super.init(nibName:" FooView",bundle:nil) }

  4. 我将FooView.xib的文件所有者设置为FooView类

  5. 我将FooView视图的自定义类设置为FooView
  6. 我将IB的一些@IBAction输出拖到了FooView实现
  7. 当我的操作触发时,我收到运行时异常:"无法识别的选择器发送到实例"它引用了FooViewController(!)。我仔细检查了文件所有者和所有输出,所有引用看起来都是正确的。

    它就像忽略事件调度的文件所有者一样。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

最后,您要在要实现它的视图类中正常声明您的IBAction。