【问题标题】:store #selector in a variable将#selector 存储在变量中
【发布时间】:2019-04-10 22:57:21
【问题描述】:

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

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 添加到您的 func 声明中,但我想知道是否有办法让我的闭包事后引用 @objc 方法,也许是通过将它包装在另一个函数中。

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

【问题讨论】:

  • 在 Swift 闭包的世界和 ObjectiveC 目标/选择器的世界之间架起一座桥梁并不容易。您能做的最好的事情是尝试编写一些使用 ObjectiveC 运行时的代码来创建一个接受闭包的函数(将限制为 @convention(c)),将其作为方法添加到假类中,并为您提供一个然后您可以使用该选择器来引用该方法。不过,这会很棘手。
  • 看看what I did here

标签: ios swift


【解决方案1】:

#selector() 基于 Objective-C 桥接,因为 swift 闭包是非 Objective-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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 2013-04-18
    • 2017-04-04
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2017-07-11
    相关资源
    最近更新 更多