0

我正在关注 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()
}

据我了解,当用户点击屏幕上的任意位置时,第一个代码使键盘消失。为了实现这一点,采用了 Target-Action 模式。

在第一个代码中#selector(hideKeyboard), hideKeyboard 似乎没有任何参数。那么为什么辅助函数中有参数(第二个代码)。

如果参数有效,为什么是gestureRecognizer: UIGestureRecognizer
我不太明白参数传递是如何工作的?

4

1 回答 1

1

AUIGestureRecognizer总是将自己作为参数传递给action处理程序方法。可以在处理程序例程中使用UIGestureRecognizerUITapGestureRecognizer因为UIGestureRecognizer它是 的超类UITapGestureRecognizer,但在这种情况下传递的实际上是UITapGestureRecognizer实例。

如果其他 s 不使用此处理程序例程UIGestureRecognizer,我会这样写:

@objc func hideKeyboard(_ gestureRecognizer: UITapGestureRecognizer) {

这允许您访问UITapGestureRecognizer超类不常见的属性。

selector语法只是使用一种快捷语法,在这种情况下足以识别该方法。它可以用来#selector(hideKeyboard(_:))表示有一个参数,但这不是必需的。

请注意,处理程序例程的参数必须是手势识别器。您不能替换其他类型,但如果您不需要访问手势识别器,则可以在处理程序例程中完全关闭该参数。

于 2019-09-29T18:44:27.573 回答