【问题标题】:Swift - protocol as type as target of button actionSwift - 协议作为按钮动作的目标类型
【发布时间】:2015-09-24 11:44:36
【问题描述】:

我正在尝试创建 - HeaderView,它是 UIView 的子类,它包含一个关闭按钮和一个标题标签。

class HeaderView: UIView {
    private var titleLabel: UILabel!
    private var closeButton: UIButton!
}

我不想将 self 添加为 closeButton 操作的目标,但想将 myViewController 设置为其目标,而且我希望 HeaderView 类可重用。

所以我声明了一个协议:

protocol CloseViewProtocol {
    func closeViewAction(sender: UIButton!)
}

并像这样声明一个变量:

class HeaderView: UIView {
    private var titleLabel: UILabel!
    private var closeButton: UIButton!

    var closeButtonTarget: CloseViewProtocol?
}

强制(在编译时)closeButtonTarget 实现 closeViewAction: 方法。

现在我不能这样做了:

closeButton.addTarget(closeButtonTarget, action: "closeViewAction:", forControlEvents: .TouchUpInside)

做哪个编译器抱怨 -

Cannot convert value of type 'CloseViewProtocol?' to expected argument type 'AnyObject?'

要解决这个问题,我可以这样做:

let buttonTarget = closeButtonTarget as! UIViewController
closeButton.addTarget(buttonTarget, action: "closeViewAction:", forControlEvents: .TouchUpInside)

有没有更好的方法来实现预期的行为?

【问题讨论】:

    标签: swift uibutton protocols


    【解决方案1】:

    我喜欢 Andrius 的方法,但要回答这个问题,您必须将 class 关键字添加到协议的继承列表中:

    protocol CloseViewProtocol: class {
        func closeViewAction(sender: UIButton!)
    }
    

    【讨论】:

    • @RichardTopchiy 是的。
    【解决方案2】:

    这有点老派 - 协议委托,新模式更具功能性编程 我建议使用闭包

    var closeHanlder:()->Void?
    

    然后将按钮作为私有变量,并在视图控制器中进行

    headerViewInstance.closeHandler = self.handleCloseFunction
    

    我应该补充一点,按钮动作是在 headerView 中处理的,它的动作做它需要的并调用 closeHandler?()

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多