如何从xib中的自定义类连接委托?

时间:2015-11-19 17:24:02

标签: ios swift delegates xib iboutlet

我创建了一个类" DeletableImageView" (.swift + .xib)使用我定义的协议" DeletableImageViewDelegate"通过我称之为委托的财产。

为清楚起见的例子:

DeletableImageView.swift

a:

我的问题是,现在,当我尝试在关联的.xib文件的控制器中使用我的类时(这意味着我在界面构建器中拖放视图并将DeletableImageView类分配给此视图)我无法链接委托属性(即使我将此属性声明为IBOutlet)。

我希望能够直接将视图的代理出口链接到"文件所有者"在.xib

当您直接在.xib文件中从tableview链接数据源和委托时,您执行的操作完全相同。

但是当我控制 - 拖动时,他们不会联系在一起。

有没有人知道发生了什么?

非常感谢。

2 个答案:

答案 0 :(得分:3)

您需要做的第一件事是从协议定义中添加@objc,以便它看起来像:

@objc protocol DeletableImageViewDelegate {
    ...
}

您可能会问为什么需要这样做。这是因为您想要将委托属性添加到故事板,并且为了设置故事板可见的某些属性,它必须具有@IBOutlet前缀,并且该前缀要求它是Objective C协议。

所以接下来要做的就是将var delegate: DeletableImageViewDelegate?更改为

@IBOutlet var delegate: DeletableImageViewDelegate?

现在,如果右键单击界面构建器中的视图,您将得到类似的内容,这意味着我们将delegate属性暴露给界面构建器。 Exposed property

如果您尝试将其连接到文件所有者(例如UIViewController),则无法使用,因为您的文件所有者仍然没有实现该协议。要实现它,你需要写:

extension UIViewController : DeletableImageViewDelegate {
    // Implementation
}

执行此操作后,您应该能够将委托属性连接到视图控制器,从而接收委托方法消息。在每种情况下,您的文件所有者都必须实施协议。

答案 1 :(得分:0)

我已经创建了与评论中类似的解决方案。但是我也不想每次都要委托代理并检查协议的实现。

weak var delegate: MenuViewDelegate?
@IBOutlet weak var _delegate: AnyObject? {
    didSet {
        if let d = _delegate {
            if let d = (d as? MenuViewDelegate) {
                delegate = d
            } else {
                print("ERROR: delegate does not implement \(d) MenuViewDelegate protocol")

                d as! MenuViewDelegate
            }
        }
    }
}