Ios 将#选择器存储在变量中
我正在向按钮添加一个目标,但是我不希望目标操作引用预定义的函数,而是希望它引用一个闭包Ios 将#选择器存储在变量中,ios,swift,Ios,Swift,我正在向按钮添加一个目标,但是我不希望目标操作引用预定义的函数,而是希望它引用一个闭包 typealias AlertAction = (title: String, handler: () -> ()) class ErrorView: UIView { func addAction(_ action: AlertAction) { let button = UIButton() ... let selector = #selector(action.ha
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方法,也许可以将它包装到另一个函数中
class AlertAction:NSObject {
var title:String?
@objc
func getHandler(sender:Any){
print("hi")
}
}
这可能吗?我不知道如何定义@objc标记的闭包,所以我不确定。#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)
#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)
在Swift闭包世界和ObjectiveC目标/选择器世界之间没有简单的桥梁。您所能做的最好的事情就是尝试编写一些代码,使用ObjectiveC运行时生成一个接受闭包的函数(该闭包将被限制为
@convention(c)
),将其作为方法添加到伪类中,并为您提供一个选择器,然后您可以使用该选择器引用该方法。不过,这将是相当棘手的。看看吧。在Swift闭包世界和ObjectiveC目标/选择器世界之间,没有一种简单的方法可以架起桥梁。您所能做的最好的事情就是尝试编写一些代码,使用ObjectiveC运行时生成一个接受闭包的函数(该闭包将被限制为@convention(c)
),将其作为方法添加到伪类中,并为您提供一个选择器,然后您可以使用该选择器引用该方法。不过,这会很棘手。看一看。