首先,请允许我声明我不是在寻找here所述的解决方案。这个解决了它使用继承,但我不能使用它,因为我的需要是有一个组合解决方案。
我基本上想在使用合成对add UIControl
执行addTarget时发送更多参数。我实际上已经有了一些工作,但我不确定它是否是好的做法,有什么缺点,以及是否有另一个更简单的解决方案。我希望你可以帮助我。这是解决方案。我基本上将控件包装在一个类中,该类接受额外的参数和一个在值改变时调用的闭包。
class ControlWithParameters {
var control: UIControl
var extraParam: String
var valueChanged: (UIControl, String) -> ()
required init(_ control: UIControl, _ extraParam: String, _ valueChanged: @escaping (UIControl, String) -> ()) {
self.control = control
self.extraParam = extraParam
self.valueChanged = valueChanged
control.addTarget(self, action: #selector(valueChanged(sender:)), for: .valueChanged)
}
@objc internal func valueChanged(sender: UIControl) {
self.valueChanged(sender, self.extraParam)
}
}
let slider = UISlider()
let extraParam = "extraParam"
let controlWithParameters = ControlWithParameters(slider, extraParam, valueChanged)
func valueChanged(_ control:UIControl, _ extraParam: String) {
print(extraParam)
}
这是一个很好的解决方案吗?我不知道这个内存是否有效,我不知道我是否因为这个简单的任务而使自己变得复杂。任何帮助表示赞赏!