是否可以在方法内创建一个动作。
func hello(){
button.addtarget(self.,#selector(itemTocall),forControlEvents:TouchInside)
let itemTocall = {
print("hello")
}
}
答案 0 :(得分:1)
不是你的意思,但从广义上说,是的。首先,请记住目标/行动是在关闭之前许多年开发的。所以功能上确实没有重叠。该操作必须是特定的选择器,必须静态存在。但是,我们可以做任何我们想要的事情。例如,我们可以简单地构建它:
class Something: NSObject {
let button = UIButton()
var dispatchFunc: (UIButton) -> Void = {_ in}
func dispatch(button: UIButton) {
dispatchFunc(button)
}
func hello(){
dispatchFunc = {_ in
print("hello")
}
button.addTarget(self, action: #selector(dispatch), for: .touchUpInside)
}
}
现在,dispatchFunc
被重写为您想要的行为,而dispatch
只是作为中间人而存在。这种技术当然可以显着扩展。您可以使用按钮(或按钮ID)到闭包的字典,以便许多不同的按钮可以动态更改它们运行的内容(即使它们都指向相同的dispatch
函数)。或者您可以拥有一系列闭包,以便可以执行多个操作。无论你想要什么。
(还有很多其他方法可以实现这一点,例如使用ObjC运行时。您可以覆盖消息调度并处理甚至没有支持方法的任意选择器,但我建议像上面这样简单的闭包。)