web-dev-qa-db-fra.com

Comment masquer le clavier dans Swift en appuyant sur la touche de retour?

J'utilise UITextfied tout en cliquant sur le clavier texte mais lorsque j'ai appuyé sur la touche return touche, 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 resignfirstresponder n'entre pas en fonction.

188

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 du code: http://www.snip2code.com/Snippet/85930/Swift-delegate-sample

356
rsc

La partie return true de cette option indique uniquement au champ de texte s'il est autorisé ou non à retourner.
Vous devez indiquer manuellement au champ de texte de fermer le clavier (ou quel que soit son premier répondeur), et cela se fait avec resignFirstResponder(), comme suit:

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

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder()
    return true
}
98
Mick MacCallum
  • Ajoutez UITextFieldDelegate à la déclaration de classe:

    class ViewController: UIViewController, UITextFieldDelegate
    
  • Connectez le textfield ou é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
    }
    
  • Ajouter la fonction suivante

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

    avec tout cela, votre clavier commencera à disparaître en touchant en dehors du champ de texte et en appuyant sur la touche retour.

44
Satnam Sync

Simple Swift 3 Solution: Ajoutez cette fonction à vos contrôleurs de vue dotés d'un champ de texte:

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

Ouvrez ensuite votre éditeur d’assistant et assurez-vous que Main.storyboard se trouve d’un côté de votre vue et que le fichier de contrôleur de vue souhaité.Swift se trouve de l’autre. Cliquez sur un champ de texte puis sélectionnez l'onglet "Afficher l'inspecteur de connexion" dans le panneau des utilitaires de droite. Faites glisser le contrôle de "Did End on Exit" à la fonction ci-dessus dans votre fichier Swift. Répétez l'opération pour tout autre champ de texte de cette scène et créez un lien vers la même fonction.

22
elarcoiris

Swift 4.2 - Aucun délégué requis

Vous pouvez créer un exutoire d'action à partir de UITextField pour l'action " principale déclenchée " et renvoyer le premier répondant sur le paramètre sender transmis:

Create Action Outlet

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

Super simple.

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

18
Mark Moeykens

@RSC

pour moi l'addition 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 clé 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 un autre endroit de l’écran:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { self.view.endEditing(true); }

13
Tobias F. Meier

Pour obtenir la suppression automatique du clavier, j'ai placé 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.

12
peacetype

Une autre façon de 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'événement Did End On Exit de chaque champ.

10
James Thompson

Lorsque l'utilisateur appuie sur le bouton Terminé sur le clavier de texte, un événement Did End on Exit est généré. à ce moment-là, nous devons indiquer au champ de texte d'abandonner le contrôle afin 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 de projet et ouvrez l'inspecteur de connexions. Faites glisser le cercle situé à côté de Did End On Exit (Quitter à la sortie) sur l'icône jaune View Controller (Contrôleur de la vue) jaune dans le storyboard, puis relâchez le bouton. Un petit menu contextuel contenant le nom d'une seule action, celle que nous venons d'ajouter, apparaîtra. Cliquez sur l'action textFieldDoneEditing pour le sélectionner et c'est tout.

8
Ian Seth Colin

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

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)
7
Darth Flyeater

Je suggérerais d'initier le cours de la SRC:

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;
}

}

7
LAOMUSIC ARTS

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

5
Gilad Brunfman

Swift

Utilisation de la fonction optionnelle de UITextFieldDelegate.

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

false signifie que ce champ peut être demandé pour démissionner. true - force démission.

3
dimpiax

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 (aussi par exemple):

self.view.endEditing(true)

cela a fonctionné pour moi

2
Blake Scott

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 activé".

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

Lorsque vous créez UIViewController et UITextField, il vous suffit d'écrire le code d'une ligne dans votre UIViewController.

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

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

2
Wu Yuan Chun

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

self.textField.delegate = self
2
Miladinho

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);
    }
2
kanishk verma
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)
}
1
Santi RibeiroO