3 votes

Le délégué UITextField textFieldShouldReturn n'est pas appelé avec le retour du clavier matériel

IOS 12, Xcode 10.1. J'ai une vue qui a un UITextField . La connexion du délégué est reliée au contrôleur de vue dans le Storyboard. J'ai fait ça des millions de fois avant.

Je veux envoyer le premier répondeur au champ suivant lorsque la touche Return est appuyée sur le clavier, la façon correcte de procéder est donc la suivante :

extension SignInViewController: UITextFieldDelegate {

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
      switch textField {
      case loginEmailField:
        loginPasswordField.becomeFirstResponder()
      case loginPasswordField:
        loginPasswordField.resignFirstResponder()
        signInTapped(sender: UIButton())
      default: break
      }
    return true
    }
}

Avec un clavier matériel attaché, soit avec mon iPad Pro avec Keyboard Case, soit sur mon Mac avec le Simulateur, la méthode delegate ne se déclenche pas. Faites apparaître le clavier à l'écran, et cela fonctionne parfaitement.

J'ai mis en place des choses similaires auparavant, et je me suis creusé la tête pour voir les différences entre elles, en vain. Quelles causes potentielles puis-je envisager pour résoudre ce problème et faire fonctionner les touches Retour des claviers matériels ?

1voto

rbaldwin Points 1275

J'ai essayé ceci et textFieldShouldReturn est appelé correctement lorsque le Retour/entrée est pressée sur le simulateur, avec le clavier du Mac, et avec un clavier bluetooth externe sur un vrai iPhone et iPad. Il y a peut-être un problème avec votre UITextFieldDelegate installation ?

J'ai également essayé de connecter le delegate à la fois dans le code (comme ci-dessous) et via Interface Builder, et les deux fonctionnent.

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textFieldA: UITextField!
    @IBOutlet var textFieldB: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        textFieldA.delegate = self
        textFieldB.delegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {

        switch textField {
        case textFieldA:
            textFieldB.becomeFirstResponder()
        case textFieldB:
            textFieldB.resignFirstResponder()
        default:
            break
        }
        return true
    }
}

0voto

Shamas S Points 5760

Vous pouvez écouter UIKeyboardWillHideNotification de NotificationCenter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X