Swift 中的 Target-Action 参数问题
Target-Action parameter issue in Swift
我正在关注 iOS 开发教程并阅读他们的代码。
第一个代码:
override func viewDidLoad() {
super.viewDidLoad()
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
gestureRecognizer.cancelsTouchesInView = false
tableView.addGestureRecognizer(gestureRecognizer)
}
第二个代码:
@objc func hideKeyboard(_ gestureRecognizer: UIGestureRecognizer) {
let point = gestureRecognizer.location(in: tableView)
let indexPath = tableView.indexPathForRow(at: point)
if indexPath != nil && indexPath!.section == 0 && indexPath!.row == 0 {
return
}
descriptionTextView.resignFirstResponder()
}
据我了解,当用户点击屏幕上的任意位置时,第一个代码使键盘消失。为了实现这一点,采用了目标-动作模式。
在第一个代码中,#selector(hideKeyboard)
,hideKeyboard 似乎没有任何参数。那么为什么helper函数中会有一个参数(第二个代码)。
如果参数有效,为什么是gestureRecognizer: UIGestureRecognizer
?
我不太明白参数传递是如何工作的?
A UIGestureRecognizer
总是将自身作为参数传递给 action
处理程序方法。在处理例程中使用 UIGestureRecognizer
而不是 UITapGestureRecognizer
是可以的,因为 UIGestureRecognizer
是 UITapGestureRecognizer
的超类,但在这种情况下传递的实际上是 UITapGestureRecognizer
实例.
如果这个处理例程没有被其他 UIGestureRecognizer
s 使用,我会这样写:
@objc func hideKeyboard(_ gestureRecognizer: UITapGestureRecognizer) {
这允许您访问 UITapGestureRecognizer
的属性,这些属性在超类中不常见。
selector
语法只是使用一种快捷语法,在这种情况下足以识别该方法。它可以使用 #selector(hideKeyboard(_:))
来表示有一个参数,但没有必要。
请注意,处理程序例程的参数必须是手势识别器。您不能替换其他类型,但如果您不需要访问手势识别器,则可以在处理程序例程中完全不使用该参数。
我正在关注 iOS 开发教程并阅读他们的代码。 第一个代码:
override func viewDidLoad() {
super.viewDidLoad()
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
gestureRecognizer.cancelsTouchesInView = false
tableView.addGestureRecognizer(gestureRecognizer)
}
第二个代码:
@objc func hideKeyboard(_ gestureRecognizer: UIGestureRecognizer) {
let point = gestureRecognizer.location(in: tableView)
let indexPath = tableView.indexPathForRow(at: point)
if indexPath != nil && indexPath!.section == 0 && indexPath!.row == 0 {
return
}
descriptionTextView.resignFirstResponder()
}
据我了解,当用户点击屏幕上的任意位置时,第一个代码使键盘消失。为了实现这一点,采用了目标-动作模式。
在第一个代码中,#selector(hideKeyboard)
,hideKeyboard 似乎没有任何参数。那么为什么helper函数中会有一个参数(第二个代码)。
如果参数有效,为什么是gestureRecognizer: UIGestureRecognizer
?
我不太明白参数传递是如何工作的?
A UIGestureRecognizer
总是将自身作为参数传递给 action
处理程序方法。在处理例程中使用 UIGestureRecognizer
而不是 UITapGestureRecognizer
是可以的,因为 UIGestureRecognizer
是 UITapGestureRecognizer
的超类,但在这种情况下传递的实际上是 UITapGestureRecognizer
实例.
如果这个处理例程没有被其他 UIGestureRecognizer
s 使用,我会这样写:
@objc func hideKeyboard(_ gestureRecognizer: UITapGestureRecognizer) {
这允许您访问 UITapGestureRecognizer
的属性,这些属性在超类中不常见。
selector
语法只是使用一种快捷语法,在这种情况下足以识别该方法。它可以使用 #selector(hideKeyboard(_:))
来表示有一个参数,但没有必要。
请注意,处理程序例程的参数必须是手势识别器。您不能替换其他类型,但如果您不需要访问手势识别器,则可以在处理程序例程中完全不使用该参数。