将#selector存储在变量中

时间:2019-04-10 22:57:21

标签: ios swift

我要向按钮添加目标,但不是让目标动作引用预定义的函数,而是希望它引用闭包。

typealias AlertAction = (title: String, handler: () -> ())

class ErrorView: UIView {

  func addAction(_ action: AlertAction) {
    let button = UIButton()
    ...
    let selector = #selector(action.handler) //error happens here
    button.addTarget(self, action: selector, for: .touchUpInside)
  }
}

我在此行出现错误:

let selector = #selector(action.handler)

是“'#selector'的参数未引用'@objc'方法,属性或初始化程序”

这是有道理的,因为通常您必须在函数声明中添加@objc,但是我想知道是否有一种方法可以让我的闭包在事实之后通过将其包装在另一个函数中来引用@objc方法。 / p>

这可能吗?我不知道如何定义标记为@objc的闭包,所以不确定。

1 个答案:

答案 0 :(得分:0)

#selector()是基于Objective-C桥接的,因为swift闭包不是非object-c的,所以您不能使用它们。

另一种解决方案是将代码包装在Objective-C函数中。

class AlertAction:NSObject {
    var title:String?

    @objc
    func getHandler(sender:Any){
        print("hi")
    }
}

并像这样使用它:

// Instance of a class
let alertAction = AlertAction()

// Usage
let button = UIButton()
let selector1 = #selector(AlertAction.getHandler)
button.addTarget(alertAction, action: selector1, for: .touchUpInside)