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

Mat*_*uci 12 delegates xib iboutlet ios swift

我创建了一个类"DeletableImageView"(.swift + .xib),它通过我称为委托的属性使用我定义为"DeletableImageViewDelegate"的协议.

为清晰起见的示例:

DeletableImageView.swift

protocol DeletableImageViewDelegate {
    func deleteImageWithTag(tag: Int!) -> (Bool)
    func addImageOnViewWithTag(tag: Int!) -> (Bool)
    ...
}

class DeletableImageView: UIView {

    var view: UIView!
    var delegate: DeletableImageViewDelegate?

    // Some random methods + some use of the delegate protocol's methods
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

我希望能够做的是直接将视图的委托出口链接到.xib中的"文件所有者"

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

但是,当我控制 - 拖动时,它们不会连接在一起.

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

非常感谢你.

Sai*_*ira 5

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

@objc protocol DeletableImageViewDelegate {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

所以你要做的下一件事是更改var delegate: DeletableImageViewDelegate?

@IBOutlet var delegate: DeletableImageViewDelegate?
Run Code Online (Sandbox Code Playgroud)

现在,如果您右键单击界面构建器中的视图,您将得到类似这样的信息,这意味着我们将委托属性暴露给了界面构建器。 暴露财产

如果您尝试将其连接到文件所有者(例如UIViewController),它将无法工作,因为您的文件所有者仍未实现该协议。要实现它,您需要编写:

extension UIViewController : DeletableImageViewDelegate {
    // Implementation
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个错误,@luk2302 是对的,我将委托属性更改为“AnyObject”,现在它可以工作了!:) 不管怎样,谢谢你们! (5认同)