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链接数据源和委托时,您完全相同.
但是,当我控制 - 拖动时,它们不会连接在一起.
有没有人知道发生了什么?
非常感谢你.
您需要做的第一件事是@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)
完成此操作后,您应该能够将委托属性连接到视图控制器,从而接收委托方法消息。在每种情况下,您的文件所有者都必须实施该协议。
| 归档时间: |
|
| 查看次数: |
6292 次 |
| 最近记录: |