keyboardWillShowNotification срабатывает при нажатии клавиши возврата (только при первом нажатии)

#ios #swift #uikit

#iOS #swift #uikit

Вопрос:

У меня очень странная проблема, которая возникает, когда я нажимаю клавишу возврата, и это происходит только тогда, когда я нажимаю ее в первый раз, каждый следующий раз, когда она работает, как ожидалось.

У меня есть простой класс для управления клавиатурой, он принимает массив текстовых полей, которые я отказался делегировать своему классу, также я регистрирую уведомления с клавиатуры:

     public init(withTextFields textFields: [UITextField]) {
        super.init()

        guard textFields.count > 0 else { return }
        textFields.forEach{ $0.delegate = self }

        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
    }
 

Это мои методы, которые просто выводят текст для дебютных целей:

 @objc func keyboardWillShow(notification: NSNotification) {
    print("aaaa")
}
@objc func keyboardWillHide(notification: NSNotification) {
    print("bbbb")
}
 

и мой UITextFieldDelegate:

     public func textFieldDidBeginEditing(_ textField: UITextField) {
        print("111")
    }

    public func textFieldDidEndEditing(_ textField: UITextField) {
        print("222")
    }

    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        print("333")
        return true
    }
 

В моем контроллере представления у меня есть два текстовых поля, которые я передаю своему классу.
Когда я нажимаю на первый, который я вижу:

 111
aaa
 

чего я и ожидал. проблема появляется, когда я нажимаю клавишу возврата на клавиатуре, затем она регистрируется:

 aaa
333
 

но он регистрирует его только при первом нажатии, каждый раз, когда он регистрируется:
333 .

Когда я нажимаю клавишу возврата, клавиатура уже отображается на экране, так почему она UIResponder.keyboardWillShowNotification снова вызывает? Мои текстовые поля должны вернуть его пустым.

Комментарии:

1. Вы пытаетесь изменить пользовательский интерфейс в соответствии с тем, что покрывает клавиатура? Если это так, я бы предложил использовать keyboardFrameChange, а не показывать / скрывать

Ответ №1:

Попробуйте вызвать resignFirstResponder() и / или view.endEditing(true) войти textFieldShouldReturn .

 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
    return true
}
 

Также попробуйте изменить UIResponder.keyboardWillHideNotification на UIResponder.keyboardDidHideNotification

Комментарии:

1. Я не собираюсь вызывать resignFirstResponder(), но он все равно регистрируется (когда я нажимаю текстовое поле: 111 aaa и после нажатия return: aaaa 333 bbbb 222). Делегаты настроены правильно, потому что они выводят текст на консоль. Спасибо.

2. Попробуйте изменить UIResponder.keyboardWillHideNotification на UIResponder.keyboardDidHideNotification

3. Можете ли вы объяснить, чего вы ожидаете?

4. То, что вы объяснили, работает, как и ожидалось, в swift. Если вы хотите переключаться между текстовыми полями, вам необходимо изменить ответчика: firstTextField.becomeFirstResponder() или secondTextField.becomeFirstResponder()

5. Он вызывает keyboardWillShow, когда вы нажимаете на текстовое поле, и он вызывает его снова, когда вы нажимаете клавишу возврата. Я ожидаю, что он вызовет keyboardWillShow при нажатии текстового поля и TextFields shouldreturn при нажатии клавиши возврата.