189 votes

Comment supprimer le clavier lors de l'édition d'un champ UITextField ?

Je sais que je dois indiquer à mon UITextField de renvoyer le premier intervenant lorsque je veux désactiver le clavier, mais je ne sais pas comment savoir si l'utilisateur a appuyé sur la touche "Done" du clavier. Existe-t-il une notification que je peux surveiller ?

2 votes

[self.view endEditing:YES] ; en touches commence le délégué est la meilleure solution

2voto

Ryan Bourne Points 21

Voici ce que j'ai dû faire pour que cela fonctionne, et je pense que c'est nécessaire pour tous ceux qui ont un pavé numérique comme clavier (ou tout autre clavier sans bouton "faire") :

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

    -(IBAction)backgroundIsTapped:(id)sender

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

Après cela, j'ai fait le lien avec la partie "touch down" pour le ViewController dans Interface Builder.

Dans la fonction 'background is tapped', j'ai mis ceci :

    [answerField resignFirstResponder];

N'oubliez pas de remplacer 'answerField' par le nom de l'UITextField dont vous voulez supprimer le clavier (assurez-vous évidemment 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 !

1voto

Tristan Leblanc Points 71

Voici une façon assez propre de terminer l'édition avec la touche Retour ou une touche en arrière-plan.

Dans le constructeur d'interface, intégrez vos champs dans une vue de la classe UIFormView

Qu'est-ce que cette classe :

  • S'attache automatiquement en tant que délégué de champ ( soit réveillé depuis la nib, soit ajouté manuellement )
  • Conserver une référence sur le champ édité actuel
  • Désactiver le clavier au retour ou au 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 œuvre

#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 fonction textFieldValueIsValid: méthode, vous éviter la fin de l'édition si la valeur n'est pas correcte pour le champ donné. champ.

  • 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éfinir un délégué différent pour un champ particulier, mais pourquoi pas

Il y a de nombreuses façons d'améliorer cette classe de vue de formulaire - Attacher un délégué, faire de la mise en page, gérer lorsque le clavier couvre un champ (en utilisant le cadre currentEditingTextField), démarrer automatiquement l'édition pour le champ suivant, ...

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

J'espère que cela vous aidera. Merci à tous

1voto

Abhimanyu Rathore Points 630

Si vous voulez que toute l'édition se fasse dans un UIViewController, vous pouvez utiliser.

[[self view]endEditing:YES];

et si vous voulez cacher le clavier d'un UITextField particulier, utilisez.

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

<UITextFieldDelegate>
  1. faire la délégation incapable à votre champ de texte .

    self.yourTextField.delegate = self ;

  2. ajoutez cette méthode dans votre viewcontroller.

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

1voto

Burf2000 Points 896

Toute personne à la recherche de Swift 3

1) Assurez-vous que votre Délégué de UITextField est relié à votre ViewController dans le Storyboard

2) Mise en œuvre UITextFieldDelegate dans votre fichier ViewController.Swift (par exemple class ViewController : UIViewController, UITextFieldDelegate { )

3) Utiliser la méthode de délégation ci-dessous

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

1voto

Tanjima Points 1831

Définir par programme le délégué de l'UITextField dans le swift 3

Implémenter UITextFieldDelegate dans votre fichier ViewController.Swift (par exemple, class 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:- handling delegate 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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X