Ошибка параметра Target-Action в Swift - PullRequest
0 голосов
/ 29 сентября 2019

Я следую учебнику по 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?
Я не совсем понимаю, как работает передача параметров?

1 Ответ

1 голос
/ 29 сентября 2019

A UIGestureRecognizer всегда передает себя в качестве параметра методу-обработчику action. Можно использовать UIGestureRecognizer вместо UITapGestureRecognizer в подпрограмме обработчика, поскольку UIGestureRecognizer является суперклассом UITapGestureRecognizer, но в данном случае передается экземпляр UITapGestureRecognizer.

Если эта подпрограмма обработчика не используется другими UIGestureRecognizer s, я написал бы ее так:

@objc func hideKeyboard(_ gestureRecognizer: UITapGestureRecognizer) {

Это позволяет вам получить доступ к свойствам UITapGestureRecognizer, которые не являются общими для суперкласса.

Синтаксис selector использует только сокращенный синтаксис, который в этом случае достаточен для идентификации метода. Он мог бы использовать #selector(hideKeyboard(_:)), чтобы указать, что есть параметр, но это необязательно.

Обратите внимание, что параметром для процедуры-обработчика должен быть распознаватель жестов. Вы не можете заменить другой тип, но вы можете вообще отключить параметр в процедуре обработчика, если вам не нужен доступ к распознавателю жестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...