addAction 和 addTarget 有什么区别
what is the difference between addAction and addTarget
我在考虑按钮点击事件,我们有不同的选择
- UITapGestureRecognizer
- 添加目标
- 添加动作
对于基本操作来说
button.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
@objc private func buttonClicked () {
print("button clicked")
}
但是我们可以做同样的事情,而无需使用以下
通过 objc 函数或选择器
extension UIControl {
func addAction(for controlEvents: UIControl.Event = .touchUpInside, _ closure: @escaping()->()) {
addAction(UIAction { (action: UIAction) in closure() }, for: controlEvents)
}
}
button.addAction(for: .touchUpInside) { [weak self] in
guard let self = self else {return}
self.buttonClicked()
}
func settingsClicked () {
print("settings clicked")
}
我查看了 apple 的 addAction 文档,在那里找不到太多内容,我想知道两者之间的区别以及我应该更多地使用哪个
addTarget(_:action:for:)
方法使用 target/action,旧的基于 Objective-C 的动态调度方法,您可以在其中提供目标对象和选择器。
如果您的目标是 iOS ≥14,您可以使用较新的 addAction(_:for:)
,它允许您提供 UIAction
对象,其中包括一个闭包。它更现代,但不适用于 iOS <14.
我在考虑按钮点击事件,我们有不同的选择
- UITapGestureRecognizer
- 添加目标
- 添加动作
对于基本操作来说
button.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
@objc private func buttonClicked () {
print("button clicked")
}
但是我们可以做同样的事情,而无需使用以下
通过 objc 函数或选择器extension UIControl {
func addAction(for controlEvents: UIControl.Event = .touchUpInside, _ closure: @escaping()->()) {
addAction(UIAction { (action: UIAction) in closure() }, for: controlEvents)
}
}
button.addAction(for: .touchUpInside) { [weak self] in
guard let self = self else {return}
self.buttonClicked()
}
func settingsClicked () {
print("settings clicked")
}
我查看了 apple 的 addAction 文档,在那里找不到太多内容,我想知道两者之间的区别以及我应该更多地使用哪个
addTarget(_:action:for:)
方法使用 target/action,旧的基于 Objective-C 的动态调度方法,您可以在其中提供目标对象和选择器。
如果您的目标是 iOS ≥14,您可以使用较新的 addAction(_:for:)
,它允许您提供 UIAction
对象,其中包括一个闭包。它更现代,但不适用于 iOS <14.