Swift - 作为按钮动作目标的类型的协议

时间:2015-09-24 11:44:36

标签: swift uibutton protocols

我正在尝试创建 - 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)

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

var closeHanlder:()->Void?

然后将按钮作为私有var内部,并在View Controller中执行

headerViewInstance.closeHandler = self.handleCloseFunction

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