【问题标题】:How to connect delegate from custom class in xib?如何在xib中连接自定义类的委托?
【发布时间】:2016-02-21 23:34:32
【问题描述】:

我创建了一个类“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
    ...
}

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

我想要做的是直接将视图的代理出口链接到 .xib 中的“文件所有者”

与直接在 .xib 文件中从 tableview 链接数据源和委托时所做的完全相同的事情。

但是当我控制并拖动它们时,它们不会链接在一起。

有人知道发生了什么吗?

非常感谢。

【问题讨论】:

标签: ios swift delegates xib iboutlet


【解决方案1】:

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

@objc protocol DeletableImageViewDelegate {
    ...
}

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

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

@IBOutlet var delegate: DeletableImageViewDelegate?

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

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

extension UIViewController : DeletableImageViewDelegate {
    // Implementation
}

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

【讨论】:

  • 我试过了,但还是不行,我开始怀疑这是否是 XCode 的错误,因为新版本的 .xib 有很多问题,或者可能是juste 在我的 Mac 上 ...仍然无法将视图链接到文件 ower ...我想准确地说我**不使用故事板 !!!**,也许这就是它不起作用的原因?
  • 这是我为帮助您了解我的问题而制作的视频:youtu.be/clYFj6dkaWk
  • 现在我看到您的可删除视图是 xib 中主视图的子视图。将扩展名添加到UIView,你应该会很好。
  • 这是一个错误,@luk2302 是对的,我将委托属性更改为 type 为“AnyObject”,现在它可以工作了! :) 无论如何,谢谢你们!
【解决方案2】:

我创建了与 cmets 类似的解决方案。但我也不想每次都强制转换委托并检查协议实现。

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
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 2016-01-03
    • 2014-11-02
    • 2012-06-25
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多