Comment masquer le clavier rapidement en appuyant sur la touche Retour?

215

J'utilise UITextfieden cliquant sur le clavier textfied apparaît mais quand j'ai appuyé sur la returntouche, le clavier ne disparaît pas. J'ai utilisé le code suivant:

func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    return true;
}

la méthode resignfirstponseer ne fonctionne pas.

Ashwinkumar Mangrulkar
la source
10
avez-vous envisagé d'accepter la réponse RSC? accepter des réponses est ce qui fait que cet endroit fonctionne et est considéré comme une bonne pratique.
Juan Boero
7
si une réponse répond à vos besoins, veuillez marquer comme réponse afin que d'autres personnes puissent en obtenir de l'aide.
Syed Md. Kamruzzaman

Réponses:

398

Vous pouvez faire en sorte que l'application ferme le clavier à l'aide de la fonction suivante

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return false
}

Voici un exemple complet pour mieux illustrer cela:

//
//  ViewController.swift
//
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var myTextField : UITextField

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.myTextField.delegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }
}

Source de code: http://www.snip2code.com/Snippet/85930/swift-delegate-sample

rsc
la source
22
Il me manquait "self.myTextField.delegate = self;" Je vous remercie!
tylerlindell
4
Je manquais le UITextFieldDelegate!
Cesare
1
@kommradHomer, sans aucun doute, il y a autre chose qui empêche votre clavier de s'afficher. Si vous voulez, mettez votre code sur pastebin et collez le lien ici pour que je le voie.
rsc
1
@RSC, vous aviez probablement raison. Je suis un débutant de 2 jours sur iOS, alors je me suis en quelque sorte débarrassé de mon problème et tout a fonctionné comme vous l'avez suggéré :)
kommradHomer
1
Alors travaille pour moi (swift 3): func textFieldShouldReturn(textField: UITextField) -> Bool {changer pour func textFieldShouldReturn(_ textField: UITextField) -> Bool {
sea-kg
112

La return truepartie de ceci indique uniquement au champ de texte s'il est autorisé ou non à revenir.
Vous devez dire manuellement au champ de texte de fermer le clavier (ou quel que soit son premier répondeur), et cela se fait avec resignFirstResponder(), comme ceci:

// Called on 'Return' pressed. Return false to ignore.

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder()
    return true
}
Mick MacCallum
la source
2
merci ... dans mon cas, la méthode "resignFirstResponder ()" n'obtenait pas automatiquement et je pensais qu'elle ne prenait pas en charge mais en écrivant manuellement son bon fonctionnement..merci que je cherche.
Ashwinkumar Mangrulkar
@AshwinMangrulkar, vous pouvez vous attendre à ce que dans la version bêta de la fonction de complétion automatique de Xcode 6, elle soit handicapée.
Paul Brewczynski
1
et bien sûr, le point-virgule après "vrai" n'est plus requis
36 By Design
1
N'est-ce pas une exigence à laquelle votre viewController est conforme UITextFieldDelegate?
Honey
1
au lieu de self.view.endEditing () cette réponse est appropriée et la bonne approche
saigen
45
  • Ajoutez UITextFieldDelegateà la déclaration de classe:

    class ViewController: UIViewController, UITextFieldDelegate
  • Connectez-le textfieldou écrivez-le par programme

    @IBOutlet weak var userText: UITextField!
  • définissez votre contrôleur de vue comme le délégué des champs de texte dans la vue s'est chargé:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
  • Ajoutez la fonction suivante

    func textFieldShouldReturn(userText: UITextField!) -> Bool {
        userText.resignFirstResponder()
        return true;
    }

    avec tout cela, votre clavier commencera à disparaître en touchant à l'extérieur du champ de texte ainsi qu'en appuyant sur la touche retour.

Codetard
la source
Merci mec! Cela me manquait: UITextFieldDelegate... merci beaucoup!
Adriano Tadao
Pour une raison quelconque, lorsque j'ai défini txtField.delegate = self, je ne peux pas taper dans ce champ de texte une fois que j'ai exécuté l'application
Jesus Rodriguez
@JesusAdolfoRodriguez il doit y avoir une raison derrière cette erreur, tho ce code ne cause aucun problème. : D Bon codage!
Codetard
Merci pour l'étape par étape. Cela m'a été plus utile qu'un simple bloc de code.
kenhkelly
1
"Avec tout cela, votre clavier commencera à disparaître en touchant en dehors du champ de texte" - Pas vrai. textFieldShouldReturn est appelé uniquement en appuyant sur le bouton de retour.
Jurasic
39

Swift 4.2 - Aucun délégué nécessaire

Vous pouvez créer une sortie d'action à partir de UITextField pour la « Action principale déclenchée » et résigner le premier répondeur sur le paramètre expéditeur transmis:

Créer une sortie d'action

@IBAction func done(_ sender: UITextField) {
    sender.resignFirstResponder()
}

Super simple.

(Merci à la vidéo de 60 secondes de Scott Smith de m'avoir informé à ce sujet: https://youtu.be/v6GrnVQy7iA )

Mark Moeykens
la source
si nous avons plusieurs champs de texte sur une page, devons-nous le faire pour chaque champ de texte ...
DragonFire
@DragonFire Vous pouvez affecter plusieurs champs de texte à la même prise. Faites simplement glisser de la sortie déclenchée par l'action principale dans l'inspecteur de sortie (côté gauche de l'écran) vers IBAction dans votre code
Brad Root
Il est bon de noter que le fait de faire glisser directement du champ de texte dans le storyboard par défaut l'action liée à Édition a pris fin, au lieu de Action principale déclenchée, donc cela devrait être fait à partir de l'inspecteur de connexions de la barre latérale.
Cloud
Incroyable. Je ne le savais pas. Merci.
Numan Karaaslan
1
Merci beaucoup. C'est exactement ce dont j'avais besoin. J'avais besoin de fermer un clavier par le bouton de retour dans une cellule de table. Fonctionne parfaitement.
piddler
22

Solution Swift 3 simple: Ajoutez cette fonction à vos contrôleurs de vue qui comportent un champ de texte:

@IBAction func textField(_ sender: AnyObject) {
    self.view.endEditing(true);
}

Ensuite, ouvrez votre éditeur assistant et assurez-vous que votre Main.storyboard est d'un côté de votre vue et que le fichier de vue controller.swift souhaité est de l'autre. Cliquez sur un champ de texte puis sélectionnez dans le panneau de droite des utilitaires le panneau «Afficher l'inspecteur de connexion». Contrôlez le glissement de la fonction "Did End on Exit" vers la fonction ci-dessus dans votre fichier swift. Répétez pour tout autre champ de texte de cette scène et créez un lien vers la même fonction.

elarcoiris
la source
14

@RSC

pour moi, l'ajout critique dans Xcode version 6.2 (6C86e) est dans override func viewDidLoad()

 self.input.delegate = self;

J'ai essayé de le faire fonctionner avec la touche de retour pendant des heures jusqu'à ce que je trouve votre message, RSC. Je vous remercie!

De plus, si vous souhaitez masquer le clavier si vous touchez ailleurs sur l'écran:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true);
    }
Tobias F. Meier
la source
12

Pour obtenir la suppression automatique du clavier, j'ai mis ce code dans l'une des méthodes de la classe de mon champ de texte personnalisé:

textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit)

Remplacez le nom de votre point de vente par textField.

type de paix
la source
1
Exceptionnel. C'est la plus courte et la meilleure option à mon avis. Surtout lorsque vous créez un champ de texte dans une autre méthode. Comme dans un en-tête de vue de table.
kakubei
Désolé, où exactement devez-vous mettre cela et que devez-vous faire pour le faire fermer le clavier? J'ai mis mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(version Swift 5) dans viewDidLoadmais ni retour ni tapotement quelque part en dehors du champ de texte n'a fonctionné. J'ai obtenu les champs de texte en créant chacun une sortie.
Néph
Je l'ai mis dans une sous-classe d'une classe personnalisée qui hérite de UIViewController. La sous-classe est également conforme à UITextViewDelegate et UITextFieldDelegate. Je l'ai mis dans la viewDidAppearméthode de cette classe. UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })Cela peut être un peu trop spécifique à mon cas, mais j'espère que cela aide. Essayez d'appeler à l'intérieur viewDidAppearet de vous conformer aux délégués si nécessaire.
peacetype
10

Une autre façon de le faire qui utilise principalement le storyboard et vous permet facilement d'avoir plusieurs champs de texte est:

@IBAction func resignKeyboard(sender: AnyObject) {
    sender.resignFirstResponder()
}

Connectez tous vos champs de texte pour ce contrôleur de vue à cette action sur l' Did End On Exitévénement de chaque champ.

James Thompson
la source
Désolé pour la bosse, mais j'essaie cette méthode dans mon application et elle ne semble pas fonctionner. J'ai un champ de texte dans la barre de navigation et je l'ai connecté à cette action avec cet événement comme vous l'avez dit, mais cela ne fonctionne pas lors de l'exécution.
wasimsandhu
Cela planterait si l'expéditeur est de type UIBarButtonItem. Si j'ajoute une barre d'outils avec le bouton Terminé au pavé numérique, votre code risque de se bloquer avec un sélecteur non reconnu envoyé au journal des instances.
Jayprakash Dubey
8

Je suggérerais d'initier la classe de RSC:

import Foundation
import UIKit

// Don't forget the delegate!
class ViewController: UIViewController, UITextFieldDelegate {

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

@IBOutlet var myTextField : UITextField?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.myTextField.delegate = self;
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}

ARTS LAOMUSIQUES
la source
8

Lorsque l'utilisateur appuie sur le bouton Terminé du clavier texte, un événement Did End On Exit est généré; à ce moment-là, nous devons dire au champ de texte de renoncer au contrôle pour que le clavier disparaisse. Pour ce faire, nous devons ajouter une méthode d'action à notre classe de contrôleur. Sélectionnez ViewController.swift, ajoutez la méthode d'action suivante:

@IBAction func textFieldDoneEditing(sender: UITextField) {
sender.resignFirstResponder()}

Sélectionnez Main.storyboard dans le Navigateur du projet et ouvrez l'inspecteur de connexions. Faites glisser le cercle à côté de Did End On Exit jusqu'à l'icône jaune Afficher le contrôleur dans le storyboard et lâchez prise. Un petit menu contextuel apparaîtra contenant le nom d'une seule action, celle que nous venons d'ajouter. Cliquez sur l'action textFieldDoneEditing pour la sélectionner et c'est tout.

Ian Seth Colin
la source
8

Voici la mise à jour Swift 3.0 du commentaire de peacetype:

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)
Darth Flyeater
la source
c'est une réponse claire
po5i
Cela devrait être la réponse acceptée. A travaillé sur un seul essai.
Jaswant Singh
7

Je déteste ajouter la même fonction à chaque UIViewController. En étendant UIViewController pour prendre en charge UITextFieldDelegate, vous pouvez fournir un comportement par défaut de "retour pressé".

extension UIViewController: UITextFieldDelegate{
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true;
    }
}

Lorsque vous créez de nouveaux UIViewController et UITextField, tout ce que vous avez à faire est d'écrire un code de ligne dans votre UIViewController.

override func viewDidLoad() {
    super.viewDidLoad()
    textField.delegate = self
}

Vous pouvez même omettre ce code d'une ligne en accrochant le délégué dans Main.storyboard. (En utilisant "ctrl" et faites glisser de UITextField vers UIViewController)

Wu Yuan Chun
la source
5

Swift 3

Ajoutez ce code ci-dessous à votre VC

//hide keyboard when user tapps on return key on the keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true);
    return false;
}

Travaille pour moi

Gilad Brunfman
la source
3

Assurez-vous que votre délégué textField est défini sur le contrôleur de vue à partir duquel vous écrivez votre code lié au champ de texte.

self.textField.delegate = self
Miladinho
la source
3

Rapide

Utilisation de la fonction optionnelle de UITextFieldDelegate.

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    return textField.endEditing(false)
}

falsesignifie que ce champ peut être invité à démissionner. true- forcer la démission.

dimpiax
la source
3
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
    self.view.addGestureRecognizer(tap)}

alors vous utilisez cette fonction

func handleScreenTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}
Santi RibeiroO
la source
2

vous pouvez le mettre n'importe où mais pas dans un UIButton

 func TextFieldEndEditing(text fiend name: UITextField!) -> Bool
{
    return (false)
}

alors vous pouvez mettre ce code dans un bouton (également par exemple):

self.view.endEditing(true)

cela a fonctionné pour moi

Blake Scott
la source
2

Dans le contrôleur de vue que vous utilisez:

//suppose you are using the textfield label as this

@IBOutlet weak var emailLabel: UITextField!
@IBOutlet weak var passwordLabel: UITextField!

//then your viewdidload should have the code like this
override func viewDidLoad() {
        super.viewDidLoad()

        self.emailLabel.delegate = self
        self.passwordLabel.delegate = self

    }

//then you should implement the func named textFieldShouldReturn
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

// -- then, further if you want to close the keyboard when pressed somewhere else on the screen you can implement the following method too:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true);
    }
kanishk verma
la source
J'aime les touchesBegan func, fonctionne en swift 4 merci.
AJ Hernandez
-1

vous devez connecter l'UITextfied avec un délégué du contrôleur de vue pour rendre cette fonction appelée

Abdulrahman Masoud
la source
-1

Tout en un Masquer le clavier et déplacer la vue sur le clavier ouvert: Swift 5

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(taped))
    view.addGestureRecognizer(tap)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
 @objc func taped(){

    self.view.endEditing(true)

}

@objc func KeyboardWillShow(sender: NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y == 0{
        self.view.frame.origin.y -= keyboardSize.height
    }


}

@objc func KeyboardWillHide(sender : NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y != 0{
        self.view.frame.origin.y += keyboardSize.height
    }

}
Imran Rasheed
la source