Comment masquer le clavier lorsque j'appuie sur la touche Retour dans un UITextField?

148

Cliquer dans un champ de texte fait apparaître le clavier. Comment le masquer lorsque l'utilisateur appuie sur la touche retour?

aden
la source
13
La bonne chose à propos de Stack Overflow est que BEAUCOUP de questions ont déjà été répondues, en particulier les plus simples. Par conséquent, veuillez chercher les réponses EN PREMIER avant de demander. Voir, c'est simple: stackoverflow.com/search?q=iphone+hide+keyboard
Felixyz
Ceci est une sous-classe de UITextfield qui modifie dynamiquement l'UIReturnKey en fonction de la condition de texte / chaîne: github.com/codeinteractiveapps/OBReturnKeyTextField
CodeInteractive

Réponses:

286

Commencez par créer votre fichier délégué pour UITextField

@interface MYLoginViewController () <UITextFieldDelegate>

@end

Ajoutez ensuite cette méthode à votre code.

- (BOOL)textFieldShouldReturn:(UITextField *)textField {        
    [textField resignFirstResponder];
    return YES;
}

Ajoutez également self.textField.delegate = self;

Saurabh
la source
1
Curieux, pourquoi <UITextFieldDelegate> n'est-il pas nécessaire? Dans ce cas, vous verrez généralement un avertissement.
pixelfreak
7
si vous rendez votre fichier délégué à l'aide d'Interface Builder, alors <UITextFieldDelegate> n'est pas nécessaire dans le fichier .h ..
Saurabh
1
ajouter <UITextFieldDelegate> dans le fichier .h et définir le délégué dans viewdidload [yourTextField setDelegate: self]; va le compléter!
Umit Kaya
@Saurabh Quelle est la particularité du storyboard créé par VC?
Paul Brewczynski
62

Dans viewDidLoaddéclarer:

[yourTextField setDelegate:self];

Ensuite, incluez le remplacement de la méthode déléguée:

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
Oscar Castellon
la source
6
+1 pour le setDelegate:rappel. J'avais définitivement oublié et le code ne fonctionnait pas auparavant.
piperchester
2
Cela ne devrait-il pas être textField, plutôt que yourTextField lorsqu'il est transmis?
Clive Jefferies
est une façon de dire que déclarez le délégué de votre textField
oscar castellon
1
<UITextFieldDelegate> doit être dans le fichier .h, sinon un avertissement apparaîtra!
Umit Kaya
22

Essayez ceci dans Swift ,

Étape 1: définir le délégué comme vous-même à votretextField

textField.delegate = self

Étape 2: ajoutez ce UITextFieldDelegate sous votre déclaration de classe,

extension YourClassName: UITextFieldDelegate {
    func textFieldShouldReturn(textField: UITextField) -> Bool {
         textField.resignFirstResponder()
        return true
    }
}
Mohammad Zaid Pathan
la source
14

En swift, faites comme ceci:
D'abord dans votre ViewControllerimplémentation, UITextFieldDelegate par exemple.

class MyViewController: UIViewController, UITextFieldDelegate {
....
}

Ajoutez maintenant un délégué à un TextFielddans lequel vous souhaitez ignorer le clavier lorsque le retour est tapé dans la viewDidLoadméthode comme ci-dessous ou à l'endroit où vous l'initialisez. Pour par exemple.

override func viewDidLoad() {

    super.viewDidLoad()   
    myTextField.delegate = self
}

Maintenant, ajoutez cette méthode.

func textFieldShouldReturn(textField: UITextField) -> Bool {

    textField.resignFirstResponder()
    return true
}
Homam
la source
1
La deuxième étape n'est pas nécessaire si vous définissez un délégué dans IB.
hris au
Apparaît (dans les versions actuelles de Swift) il devrait y avoir un trait de soulignement avant "textField:"
Bryce Sandlund
2

Essaye ça,

[textField setDelegate: self];

Ensuite, dans la méthode déléguée textField

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}
Vineesh TP
la source
ce n'est pas la meilleure pratique pour le faire.
orafaelreis
nécessite UITextFieldDelegate dans la définition d'interface.
Alp Altunel
@AlpAltunel: Merci pour le commentaire, il y a 4 ans.
Vineesh TP
1

set delegate of UITextField, and over ride, textFieldShouldReturnmethod, dans cette méthode, écrivez simplement les deux lignes suivantes:

[textField resignFirstResponder];
return YES;

c'est tout. Avant d'écrire un code, n'oubliez pas de définir le délégué de a UITextFieldet de définir le type de touche Retour sur "Terminé" dans la fenêtre des propriétés (commande + Maj + I).

Matrice
la source
1

Vous pouvez connecter "Primary Action Triggered" (clic droit sur UITextField) avec un IBAction et vous pouvez démissionner du premier répondeur (sans délégation). Exemple (Swift 4):

@IBAction func textFieldPrimaryAction(_ sender: UITextField) {
    sender.resignFirstResponder()
    ...
}
Ferenc Kiss
la source
Méthode préférée si vous utilisez des storyboards.
lal
1

Swift 4

Définissez le délégué du UITextFieldcontrôleur de vue,, field.delegate = selfpuis:

extension ViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // don't force `endEditing` if you want to be asked for resigning
        // also return real flow value, not strict, like: true / false
        return textField.endEditing(false)
    }
}
dimpiax
la source
Comment géreriez-vous le fait que les utilisateurs souhaitent «tabuler» vers le champ de texte suivant en appuyant sur la touche de retour, jusqu'à ce que le dernier, puis il démissionne? Aussi dans SwiftUI.
Learn2Code
@ Learn2Code crée un gestionnaire, collecte les champs de texte et la chaîne, le dernier déclenchera la fonction de finition.
dimpiax
1

Si vous souhaitez masquer le clavier pour une utilisation particulière du clavier [self.view resignFirstResponder]; Si vous souhaitez masquer un clavier de la vue, utilisez[self.view endEditing:true];

Graycodder
la source
0
[textField resignFirstResponder];

Utilisez ceci

DURGESH
la source
0

Ok, je pense que pour un novice, les choses peuvent être un peu déroutantes. Je pense que la bonne réponse est un mélange de tout ce qui précède, du moins dans Swift4.

Créez une extension ou utilisez le ViewController dans lequel vous souhaitez l'utiliser, mais assurez-vous d'implémenter UITextFieldDelegate. Pour des raisons de réutilisation, j'ai trouvé plus facile d'utiliser une extension:

extension UIViewController : UITextFieldDelegate {
    ...
}

mais l'alternative fonctionne aussi:

class MyViewController: UIViewController {
    ...
}

Ajoutez la méthode textFieldShouldReturn (en fonction de votre option précédente, soit dans l'extension ou dans votre ViewController)

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

Dans votre méthode viewDidLoad, définissez le délégué du champ de texte sur self

@IBOutlet weak var myTextField: UITextField!
...

override func viewDidLoad() {
    ..
    myTextField.delegte = self;
    ..
}

Cela devrait être tout. Maintenant, lorsque vous appuyez sur returnle textFieldShouldReturndevrait être appelé.

Alex
la source
0

Définissez cette classe, puis définissez votre champ de texte pour utiliser la classe et cela automatise tout le clavier de masquage lorsque le retour est appuyé automatiquement.

class TextFieldWithReturn: UITextField, UITextFieldDelegate
{

    required init?(coder aDecoder: NSCoder) 
    {
        super.init(coder: aDecoder)
        self.delegate = self
    }

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

}

Ensuite, tout ce que vous avez à faire dans le storyboard est de définir les champs pour utiliser la classe:

entrez la description de l'image ici

iphaaw
la source