Question

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

Était-ce utile?

La solution

J'ai défini le délégué du UITextField sur ma classe ViewController .

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

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

Autres conseils

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 au champ UITextField qui a été 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 saisit du texte et ferme le champ de texte, ce message sera envoyé au contrôleur.

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 l'événement de connexion IB, "Did End On Exit". à cela.

kubi, merci. Votre code a fonctionné. Juste pour être explicite (pour les débutants comme) comme vous dites que vous devez définir le délégué de UITextField pour qu'il soit é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;
}

Voici un truc pour obtenir un comportement de renvoi automatique du clavier 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-le 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 tout! Etant donné que l'événement Did End on Exit du champ de texte a maintenant une action paire 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é dans 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.

Ajoutez simplement

[textField endEditing:YES];

vous souhaitez désactiver le clavier et afficher la vue Sélecteur.

Dans Swift, vous pouvez écrire une action IBAction dans le contrôleur et définir l'événement Fait fin à la sortie du champ de texte sur cette action

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

Vous pouvez également 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];
 }

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 clavier sans bouton "done":

  1. J'ai remplacé UIView dans le 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, je me suis connecté au bit "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 de 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!

Vous remarquerez que la méthode & text; 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. Vous pouvez également 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 la "validation" test qui refuse 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 conforme à mes attentes.

- (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 suivie 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 revenir à l'appelant?! En dehors de 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] NO!
13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO
59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard

Voici un moyen relativement simple de terminer l'édition avec la touche de retour ou une touche tactile 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)
  • Conserver une référence sur le champ modifié en cours
  • 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 remplaçant le textFieldValueIsValid: , vous peut éviter la fin d’édition si la valeur n’est pas correcte pour la donnée 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 dans un domaine particulier, mais pourquoi pas & # 8230;

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

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

J'espère que cela aidera. Salut à tous

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

[[self view]endEditing:YES];

et si vous souhaitez supprimer un masque de clavier UITextField particulier, utilisez-le.

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

<UITextFieldDelegate>
  1. rendre la délégation impossible pour 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;}

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
}()

// Marque: - 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
}

Créez un masquage de fonction et liez-le au champ de texte du fichier .xib, puis sélectionnez DidEndOnExit

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  

Si vous avez créé la vue à l'aide d'Interface Builder, utilisez les éléments suivants Il suffit de créer une méthode,

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

Cliquez avec le bouton droit de la souris sur le champ de texte dans la vue, définissez l'événement sur "Terminé à la sortie" et connectez-le à la méthode "renvoiClavard".

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

essayez ceci

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}

Toute personne à la recherche de Swift 3

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

.

2) Implémentez UITextFieldDelegate 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 }

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()
    }

Swift 3, iOS 9 +

@IBAction private func noteFieldDidEndOnExit (_ expéditeur: UITextField) {} ??

UPD: Cela fonctionne toujours bien pour moi. Je pense que le gars qui a consacré cette réponse n'a tout simplement pas compris qu'il devait lier cette action à UITextField au niveau du scénario.

textField.returnKeyType = UIReturnKeyDone;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top