我创建了一个类" DeletableImageView" (.swift + .xib)使用我定义的协议" DeletableImageViewDelegate"通过我称之为委托的财产。
为清楚起见的例子:
DeletableImageView.swift
a:
我的问题是,现在,当我尝试在关联的.xib文件的控制器中使用我的类时(这意味着我在界面构建器中拖放视图并将DeletableImageView类分配给此视图)我无法链接委托属性(即使我将此属性声明为IBOutlet)。
我希望能够直接将视图的代理出口链接到"文件所有者"在.xib
中当您直接在.xib文件中从tableview链接数据源和委托时,您执行的操作完全相同。
但是当我控制 - 拖动时,他们不会联系在一起。
有没有人知道发生了什么?
非常感谢。
答案 0 :(得分:3)
您需要做的第一件事是从协议定义中添加@objc
,以便它看起来像:
@objc protocol DeletableImageViewDelegate {
...
}
您可能会问为什么需要这样做。这是因为您想要将委托属性添加到故事板,并且为了设置故事板可见的某些属性,它必须具有@IBOutlet
前缀,并且该前缀要求它是Objective C协议。
所以接下来要做的就是将var delegate: DeletableImageViewDelegate?
更改为
@IBOutlet var delegate: DeletableImageViewDelegate?
现在,如果右键单击界面构建器中的视图,您将得到类似的内容,这意味着我们将delegate属性暴露给界面构建器。
如果您尝试将其连接到文件所有者(例如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
}
}
}
}