web-dev-qa-db-fra.com

Comment écarter le clavier lors de l'édition d'un UITextField

Je sais que je dois dire à mon UITextField de démissionner du premier répondant lorsque je souhaite supprimer le clavier, mais je ne sais pas comment savoir quand l'utilisateur a appuyé sur la touche "Terminé" du clavier. Existe-t-il une notification à surveiller?

178
kubi

Je règle le délégué de la UITextField dans ma classe ViewController.

Dans cette classe, j'ai implémenté cette méthode comme suit:

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

Si vous connectez l'événement DidEndOnExit du champ de texte à une action (IBAction) dans InterfaceBuilder, le message sera envoyé lorsque l'utilisateur fermera le clavier (avec la clé de retour) et l'expéditeur sera une référence à UITextField qui a déclenché l'événement.

Par exemple:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

Ensuite, dans InterfaceBuilder, liez l'événement DidEndOnExit du champ de texte à cette action sur votre contrôleur (ou tout ce que vous utilisez pour lier des événements à partir de l'interface utilisateur). Chaque fois que l'utilisateur entre du texte et rejette le champ de texte, le contrôleur reçoit ce message.

47
Jason Coco

Vous pouvez également créer une méthode dans votre contrôleur

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

puis dans l'inspecteur de connexion dans IB connectez l'événement "Did End on Exit" à l'événement.

32
Hugo

kubi, merci. Votre code a fonctionné. Juste pour être explicite (pour les débutants comme) comme vous dites que vous devez définir le UITextField de delegate pour être égal au ViewController dans lequel réside le champ de texte. Vous pouvez le faire où bon vous semble. J'ai choisi la méthode viewDidLoad.

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}
19
alexander White

Voici une astuce pour obtenir un comportement de renvoi du clavier automatique sans code du tout. Dans le nib, éditez l'objet proxy Premier répondant dans l'inspecteur d'identité, en ajoutant une nouvelle action de premier répondant. appelons cela dummy:. À présent, raccordez l'événement Did End on Exit du champ de texte à l'action dummy: de l'objet proxy First Responder. C'est ça! Etant donné que l'événement Did End on Exit du champ de texte a maintenant une paire action-cible, le champ de texte ferme automatiquement son clavier lorsque l'utilisateur appuie sur Retour; et comme il n'y a pas de pénalité pour ne pas trouver de gestionnaire pour un message envoyé par la chaîne de répondeurs, l'application ne plante pas, même s'il n'y a pas d'implémentation de dummy: nulle part.

18
matt

Il suffit d'ajouter

[textField endEditing:YES];

où vous voulez désactiver le clavier et afficher la vue du sélecteur.

11
user415897

Dans Swift, vous pouvez écrire une action IBAction dans le contrôleur et attribuer à l'événement terminé à la sortie du champ de texte cette action.

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}
9
Safin Ahmed

Vous pouvez aussi utiliser

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

Meilleur si vous avez plusieurs Uitextfields:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }
4
Metalhead1247

Voici ce que je devais faire pour que cela fonctionne, et je pense que cela est nécessaire pour toute personne disposant d'un pavé numérique pour clavier (ou de tout autre sans bouton de fin):

  1. J'ai remplacé UIView dans ViewController par UIControl.
  2. J'ai créé une fonction appelée

    -(IBAction)backgroundIsTapped:(id)sender
    

Cela a également été défini dans le fichier .h.

Après cela, je me suis connecté au bit de toucher du ViewController dans Interface Builder.

Dans la fonction "l'arrière-plan est exploité", j'ai mis ceci:

    [answerField resignFirstResponder];

N'oubliez pas de remplacer 'answerField' par le nom du UITextField dont vous souhaitez supprimer le clavier (assurez-vous bien que votre UITextField est défini comme ci-dessous :)

    IBOutlet UITextField * <nameoftextfieldhere>;

Je sais que ce sujet est probablement mort depuis longtemps ... mais j'espère que cela aidera quelqu'un, quelque part!

2
Ryan Bourne

Vous remarquerez que la méthode "textFieldShouldReturn" fournit l'objet de champ de texte qui a appuyé sur la touche DONE. Si vous définissez le TAG, vous pouvez activer ce champ de texte. Ou vous pouvez suivre et comparer le pointeur de l'objet avec une valeur de membre stockée par son créateur.

Mon approche est la suivante pour une étude personnelle:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

En attendant, je mets le test de "validation" qui nie la démission suit. Ce n'est qu'à titre d'illustration, donc si l'utilisateur tape NO! dans le domaine, il ne sera pas rejeté. Le comportement était tel que je voulais, mais la séquence de sortie n'était pas celle que je pensais.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

Voici ma sortie NSLog pour ce refus suivi de l'acceptation. Vous remarquerez que je retourne le résultat de la démission, mais je m'attendais à ce qu'il me retourne FAUX pour que je fasse rapport à l'appelant?! Autre que cela, il a le comportement nécessaire.

 13.313 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:] 
 13.320 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldEndEditing:] 
 13.327 StudyKbd [109: 207]! 
 13.333 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:]: a abandonné le clavier 
 59.891 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:] 
 59.897 StudyKbd [109: 207]. : 207] - [StudyKbdViewController textFieldShouldEndEditing:] 
 59.917 StudyKbd [109: 207] - [StudyKbdViewController doneEditText]: NON 
 59.928 StudyKbd [109: 207] - [StudyKbdViewController text: Champ: recherche] clavier
2
mobibob

Swift 4.2 et ça fonctionnera à 100%

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        self.textField.delegate = self

    }

    // hide key board when the user touches outside keyboard

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

    // user presses return key

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

}
1
Gulsan Borbhuiya

si vous voulez toute l'édition d'un UIViewController, vous pouvez l'utiliser.

[[self view]endEditing:YES];

et si vous voulez ignorer un cache de clavier UITextField particulier, utilisez-le.

1.ajoutez un délégué dans votre viewcontroller.h

<UITextFieldDelegate>
  1. rendre la délégation impossible à votre champ de texte.

    self.yourTextField.delegate = self;

  2. ajoutez cette méthode à votre contrôleur de vue.

    - (BOOL) textFieldShouldEndEditing: (UITextField *) textField {[textField resignFirstResponder]; retourner OUI;}

1

Définissez par programme le délégué de UITextField dans Swift 3

Implémentez UITextFieldDelegate dans votre fichier ViewController.Swift (par exemple, la classe ViewController: UIViewController, UITextFieldDelegate {)

 lazy var firstNameTF: UITextField = {

    let firstname = UITextField()
    firstname.placeholder = "FirstName"
    firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    firstname.textAlignment = .center
    firstname.borderStyle = UITextBorderStyle.roundedRect
    firstname.keyboardType = UIKeyboardType.default
    firstname.delegate = self
    return firstname
}()

lazy var lastNameTF: UITextField = {

    let lastname = UITextField()
    lastname.placeholder = "LastName"
    lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
    lastname.textAlignment = .center
    lastname.borderStyle = UITextBorderStyle.roundedRect
    lastname.keyboardType = UIKeyboardType.default
    lastname.delegate = self
    return lastname
}()

lazy var emailIdTF: UITextField = {

    let emailid = UITextField()
    emailid.placeholder = "EmailId"
    emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
    emailid.textAlignment = .center
    emailid.borderStyle = UITextBorderStyle.roundedRect
    emailid.keyboardType = UIKeyboardType.default
    emailid.delegate = self
    return emailid
}()

// Mark: - traitement du délégué textField ..

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)
}

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

    if textField == firstNameTF {

        lastNameTF.becomeFirstResponder()
    }

    else if textField == lastNameTF {

        emailIdTF.becomeFirstResponder()
    }
    else {
        view.emailIdTF(true)
    }
    return true
}
1
Tanjima

Voici une manière assez propre de terminer l’édition avec la touche Retour ou un contact en arrière-plan.

Dans le générateur Interface, intégrez vos champs dans une vue de la classe UIFormView.

Qu'est-ce que cette classe:

  • Se rattache automatiquement en tant que délégué de champs (soit réveillé de nib, soit ajouté manuellement)
  • Garder une référence sur le champ en cours d'édition
  • Fermer le clavier au retour ou toucher en arrière-plan

Voici le code:

Interface

#import <UIKit/UIKit.h>

@interface UIFormView : UIView<UITextFieldDelegate>

-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;

@end

Mise en oeuvre

#import "UIFormView.h"

@implementation UIFormView
{
    UITextField* currentEditingTextField;
}

// Automatically register fields

-(void)addSubview:(UIView *)view
{
    [super addSubview:view];
    if ([view isKindOfClass:[UITextField class]]) {
        if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
    }
}

// UITextField Protocol

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    currentEditingTextField = textField;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    currentEditingTextField = NULL;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self endEdit];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([self textFieldValueIsValid:textField]) {
        [self endEdit];
        return YES;
    } else {
        return NO;
    }
}

// Own functions

-(void)endEdit
{
    if (currentEditingTextField) {
        [currentEditingTextField endEditing:YES];
        currentEditingTextField = NULL;
    }
}


// Override this in your subclass to handle eventual values that may prevent validation.

-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
    return YES;
}

@end
  • En sous-classant le formulaire et en surchargeant la méthode textFieldValueIsValid:, vous pouvez éviter la fin de l'édition si la valeur n'est pas correcte pour le champ donné.

  • Si un champ a un délégué défini dans Interface Builder, le formulaire ne le modifie pas. Je ne vois pas beaucoup de raisons de désigner un délégué différent dans un domaine particulier, mais pourquoi pas…

Il existe de nombreuses façons d’améliorer cette classe d’affichage sous forme de formulaire: attacher un délégué, faire une mise en page, gérer lorsque les claviers recouvrent un champ (à l’aide du cadre currentEditingTextField), démarrer automatiquement l’édition du champ suivant, ...

Personnellement, je le garde dans mon framework, et toujours en sous-classe pour ajouter des fonctionnalités, il est assez souvent utile "tel quel".

J'espère que ça va aider. Salut à tous

1
Moose
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}
0
jake

essaye ça

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
0
Vineesh TP

Voici comment je rejette le clavier dans Swift 4.2 et cela fonctionne pour moi:

    override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: 
    #selector(dismissKeyboard))

    view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    numberField.resignFirstResponder()
    }
0

Quiconque cherche Swift

1) Assurez-vous que votre délégué de UITextField est connecté à votre ViewController dans le scénarimage

2) Implémentez ITextFieldDelegate dans votre fichier ViewController.Swift (par exemple, la classe ViewController: UIViewController, UITextFieldDelegate {)

3) Utilisez la méthode de délégué ci-dessous

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }
0
Burf2000

Si vous avez créé la vue à l'aide d'Interface Builder, utilisez ce qui suit Créez simplement une méthode,

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

Cliquez simplement avec le bouton droit de la souris sur le champ de texte dans la vue et définissez l’événement sur Did End on Exit, puis connectez-le à la méthode "Clé de rejet".

Le meilleur guide pour les débutants est "Développement Head Head iPhone et iPad, 2e édition"

0
chandru

Créez une fonction hidekeyboard et associez-la au champ de texte du fichier .xib, puis sélectionnez DidEndOnExit.

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  
0
pooja_chaudhary