0

J'ai une scène story-board qui a seulement deux UITextField .La première est laissée intacte, frais émoulu de la bibliothèque d'objets. Le second a sa sortie déléguée connectée au code ViewController.'resignFirstResponder() retourne true et le champ de texte perd le focus, mais le clavier ne négligez pas

App's interface

The second text field's connection in IB

(Désolé, je dois publier des images de cette façon, parce que StackOverflow ne me laisse pas.)

Le code est très simple. C'est tout.

class ViewController: UIViewController, UITextFieldDelegate {  
    func textFieldDidBeginEditing(textField: UITextField) { 
     textField.resignFirstResponder() 
    } 
} 

La seule chose qu'il fait est de rejeter le clavier quand il est sur le point de monter.

La première affiche normalement le clavier. Le second ne montre pas le clavier parce qu'il est immédiatement rejeté.

Tout fonctionne parfaitement tout seul, jusqu'à ce que je clique sur le premier champ de texte pour faire apparaître le clavier, puis avec le clavier sur l'écran, je clique sur le deuxième champ de texte. Ce qui se passe ensuite, c'est que le deuxième champ de texte perd son focus, mais le clavier reste à l'écran.

En utilisant print(:), j'ai vérifié que, quand je l'appelle resignFirstResponder sur le deuxième champ de texte, il est le premier intervenant, et la valeur de retour de cet appel est true, et après l'appel, il n'est plus le premier répondeur .

Mais le clavier est toujours là ...

J'ai essayé d'ajouter print(:) dans la méthode du délégué textFieldShouldReturn(:), et en cliquant sur la touche de retour après le champ de texte a démissionné. Il n'y avait rien imprimé dans la console de débogage.

J'ai essayé disablesAutomaticKeyboardDismissal(), ne renvoyant ni false ni true produit n'importe quelle différence.

Modifier

Ce que je veux est simple: Je veux que le premier champ de texte pour faire quoi que c'est par défaut de le faire, et le second de rejeter son clavier dès qu'il est exploité (du point de vue de l'utilisateur, essentiellement signifiant ne pas le montrer).

Je sais textFieldShouldBeginEditing(:), mais je ne peux pas l'utiliser pour diverses raisons, je dois juste le clavier rejeter après il a été activé.

Modifier Encore une fois

j'ai essayé view.endEditing(true) aussi bien. En fait, j'ai essayé .endEditing(true) sur chaque vue de la scène. Ne fonctionne pas

Répondre

1

smth Try comme ça:

func textFieldShouldBeginEditing(textField: UITextField) -> Bool { 
    view.endEditing(true) 
    return true 
} 

func textFieldDidBeginEditing(textField: UITextField) { 
    textField.resignFirstResponder() 
    //make here whatever you like 

} 
+0

Désolé, je ne faisais pas mes intentions plus claires. Les comportements du premier champ de texte ne m'intéressent pas.Je veux rejeter le clavier pour le deuxième champ de texte. Et j'ai déjà essayé endEditing. Cela ne semble pas fonctionner. S'il vous plaît voir mes modifications à la question. – CCC

+0

J'ai édité ma réponse. Est-ce que c'est bon pour toi? –

+0

Cela fonctionne! Et remplacer la boucle for-in par un appel 'endEditing (true)' fonctionne également. Pouvez-vous me dire pourquoi cela fonctionne? – CCC