web-dev-qa-db-fra.com

Comment fermer le clavier numérique en tapant n'importe où

J'aimerais connaître le code le plus simple pour ignorer le clavier numérique lorsque vous appuyez n'importe où en dehors du pavé numérique. C'est une application simple qui permet de saisir un numéro dans un champ de texte. L'utilisateur peut ensuite fermer le clavier une fois que l'utilisateur a fini de saisir les chiffres dans le champ de texte. Merci! :)

49
jsanmtosj

Déclarer le champ de texte en tant que variable d'instance ou propriété si ce n'est pas déjà fait et implémenter une méthode simple comme celle-ci:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [textField resignFirstResponder];
}

fera très bien.

85
Filip Radelic

Essayez cette méthode, 

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

Maintenant, appuyez n'importe où et le clavier disparaîtra. :-)

21
Gajendra K Chauhan

Pour utiliser rapidement le code ci-dessous

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
 {
       textFiled.resignFirstResponder()
 }

Découvrez la dernière mise à jour en suivant Lien

7
abdul sathar

Toucher l'arrière-plan pour fermer le clavier

Accédez à Xcode si vous n’y êtes pas déjà. Nous devons ajouter une action supplémentaire à notre classe de contrôleur. Ajoutez la ligne suivante à votre fichier Control_FunViewController.h: 

#import <UIKit/UIKit.h>
@interface Control_FunViewController : UIViewController { 
UITextField *nameField;
UITextField *numberField;
}
 @property (nonatomic, retain) IBOutlet UITextField *nameField; ]
@property (nonatomic, retain) IBOutlet UITextField *numberField; 
- (IBAction)textFieldDoneEditing:(id)sender; 
- (IBAction)backgroundTap:(id)sender; 
@end  

Enregistrez le fichier d'en-tête. Basculez vers le fichier d'implémentation et ajoutez ce code, qui indique simplement aux deux champs de texte de donner le statut de premier répondant s'ils l'ont. Il est parfaitement sûr d'appeler resignFirstResponder sur une commande qui n'est pas le premier intervenant. Vous pouvez donc l'appeler en toute sécurité sur les deux champs de texte sans avoir à vérifier si l'un des répondeurs est actif.

- (IBAction)backgroundTap:(id)sender { 
[nameField resignFirstResponder]; 
[numberField resignFirstResponder];
}

CONSEIL Enregistrez ce fichier et revenez à Interface Builder. Nous devons maintenant changer la classe sous-jacente de notre point de vue. Si vous regardez la fenêtre principale de la pointe, vous verrez qu’il ya trois icônes dans cette vue. Le troisième, appelé View, est la vue principale de notre nib qui contient tous les autres contrôles et vues sous forme de sous-vues . Cliquez une fois sur l’icône appelée View, qui représente la vue conteneur de notre nib. Appuyez sur 4 pour faire apparaître l'inspecteur d'identité. C'est ici que nous pouvons changer la classe sous-jacente de toute instance d'objet dans Interface Builder.

Vous allez basculer beaucoup entre les fichiers d’en-tête et d’implémentation à mesure que vous codez. Heureusement, Xcode possède une combinaison de touches qui vous permet de basculer rapidement entre ces fichiers. La combinaison de touches par défaut est (option-commande-flèche haut), bien que vous puissiez le changer à votre guise en utilisant les préférences de Xcode.76 

Le champ intitulé Classe indique actuellement UIView. Changez-le pour lire UIControl. Tous les contrôles capables de déclencher des méthodes d'action sont des sous-classes de UIControl. Ainsi, en changeant la classe sous-jacente, nous venons de donner à cette vue la possibilité de déclencher des méthodes d'action. Vous pouvez le vérifier en appuyant sur ␣2 pour faire apparaître l'inspecteur de connexions. 

Faites glisser de l’événement Touch Down vers l’icône Propriétaire du fichier, puis choisissez l’action backgroundTap: . Désormais, si vous touchez n'importe où dans la vue sans contrôle actif, notre nouvelle méthode d'action sera déclenchée et le clavier se rétractera.

NOTEEnregistrez la plume, revenons en arrière et essayez-la. Compilez et exécutez à nouveau votre application. Cette fois, le clavier doit disparaître non seulement lorsque vous appuyez sur le bouton Terminé, mais également lorsque vous cliquez sur un emplacement autre que le contrôle actif, qui correspond au comportement attendu par votre utilisateur.

6
rptwsthi

J'ai essayé de mettre en œuvre certaines des solutions ici et j'ai constaté qu'elles posaient problème. Notamment, Ma UIView contient une UIScrollView, qui semble intercepter les contacts.

Lorsque cela a échoué, j’ai considéré que "taper n'importe où" était un comportement un peu indéterminé, obligeant l’utilisateur à deviner comment masquer le clavier au lieu de leur donner des instructions claires.

En outre, j’ai un bouton "Retour" ou "Terminé" sur tous les autres claviers que je montre dans l’application, j’étais donc déterminé à donner à l’utilisateur un moyen simple, intuitif et clairement spécifié d’écarter le clavier avec un pavé numérique. en ligne avec les autres mécanismes de suppression de clavier utilisés.

Je me rends compte que ce n’est pas ce que demande spécifiquement le PO, mais j’estime qu’il s’agit d’une meilleure solution que la demande «taper n'importe où» (et elle est facile à mettre en œuvre!).

Le code suivant est appelé dans le cadre de -viewDidLoad dans ma UIViewController.

// My app is restricted to portrait-only, so the following works
UIToolbar *numberPadAccessoryInputView      = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0f)];

// My app-wide tint color is a gold-ish color, so darkGray contrasts nicely
numberPadAccessoryInputView.barTintColor    = [UIColor darkGrayColor];

// A basic "Done" button, that calls [self.textField resignFirstResponder]
UIBarButtonItem *numberPadDoneButton        = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self.textField action:@selector(resignFirstResponder)];

// It's the only item in the UIToolbar's items array
numberPadAccessoryInputView.items           = @[numberPadDoneButton];

// In case the background of the view is similar to [UIColor darkGrayColor], this
// is put as a contrasting Edge line at the top of the UIToolbar
UIView *topBorderView                       = [[UIView alloc] initWithFrame:CGRectMake(0, 0, numberPadAccessoryInputView.frame.size.width, 1.0f)];
topBorderView.backgroundColor               = [UIColor whiteColor];
[numberPadAccessoryInputView addSubview:topBorderView];

// Make it so that this UITextField shows the UIToolbar
self.textField.inputAccessoryView           = numberPadAccessoryInputView;

Avec cela, il y a un joli, joli, contrôle intuitif ajouté en haut du clavier qui indique clairement comment l'utilisateur doit procéder quand ils ont fini avec leur saisie de texte. 

Je crois toujours que Apple devrait fournir un bouton "Terminé" pour ce clavier (comme le lien posté par Janak Nirmal), mais c'est pour moi la solution la plus élégante qui ne soit pas Apple. 

3
mbm29414

Vous devez utiliser UITapGestureRecognizer pour y parvenir.

UITapGestureRecognizer *tapToDismiss = [[UITapGestureRecognizer alloc]initWithTarget: self action: @selector (dismissNumberKeyBoard:)];

Ensuite, dans votre méthode licencierNumberKeyboard, 

-(Void)dismissNumberKeyboard : (id)sender {

   [yourTextField resignFirstResponder];

}

Bonne codage!

2
Valentina

Il suffit de créer une fonction simple comme celle-ci ..

    -(IBAction)hideKeyboard:(id)Sender
{
    [_textValue resignFirstResponder];
}

maintenant, allez dans votre fichier nib et connectez cette fonction avec le champ de texte avec didEndOnExit et vous êtes prêt à partir. Maintenant, lorsque vous cliquez en dehors de votre champ de texte, le clavier se cache.

1
Hadi

Vous pouvez très bien implémenter la réponse de @ mbm en mettant une didSet sur le point de vente et en y joignant votre inputAccessoryView:

Code rapide:

  @IBOutlet var input: UITextField! { didSet {
    let toolbar = UIToolbar(frame: CGRect(Origin: CGPoint.zero, size: CGSize(width: 0, height: 44)))
    toolbar.items = [
      UIBarButtonItem(barButtonSystemItem: .done, target: self.input,
        action: #selector(resignFirstResponder))
    ]
    input.inputAccessoryView = toolbar
  }}

Dans xcode 8/iOS 10 Cela donne finalement quelque chose comme ça:

 enter image description here

1
SimplGy

Si vous avez créé un pavé numérique personnalisé ou un autre popover, une autre solution consisterait à utiliser un identificateur de geste dans l'init de votre UIView comme ceci:

tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self addGestureRecognizer:tapper];

 _yourViewController = [[CustomViewController alloc] init];
_yourPopoverController = [[UIPopoverController alloc] initWithContentViewController:_yourViewController];
_yourPopoverController.popoverContentSize = CGSizeMake(550, 300);
_yourViewController.delegate = self;

Et demandez à la poignéeSingleTap de fermer la fenêtre popover si elle est visible et de rejeter la modification:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    if ([_yourPopoverController isPopoverVisible]) {
        [_yourPopoverController dismissPopoverAnimated:YES];
    }

    [self endEditing:YES];
}
0
arinmorf

Pour Swift 3/4, j'aime bien ce cas: 

  1. View Controller est une sous-classe pour UITextFieldDelegate 
  2. Dans la fonction viewDidLoad, vous devez définir yourPhonePadField.delegate = self
  3. Et remplacer cette fonction:

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

Normalement, quand l'utilisateur appuie sur le bouton 'Annuler', je l'utilise pour faire disparaître le clavier - 

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar
{
    NSLog(@"cancel clicked");
    [searchBar resignFirstResponder]; // dismiss keyboard
    return;
}

Si vous voulez faire cela lorsque l'utilisateur touche n'importe où en dehors de la zone du clavier, vous devez alors implémenter touchesEnded & mettre ce code là - 

/* Delegate for when touch ends.  */
-(void)touchesEnded:(NSSet *)touches 
          withEvent:(UIEvent *)event
{
    [searchBar resignFirstResponder];
}

Je n'ai moi-même pas essayé cela, mais je pense que cela devrait faire l'affaire ...

0
Srikar Appalaraju

J'ai dû implémenter un UX similaire pour mon UITableView (à l'intérieur duquel apparaît un UITextField). Tout d’abord, ajoutez une UITapGestureRecognizer à la tableView. Cela va commencer à attraper tous les robinets qui se produisent à partir de maintenant.

UITapGestureRecognizer* tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
        [self.tableView addGestureRecognizer:tapGestureRecognizer];
        [tapGestureRecognizer release];

L'effet secondaire est toutefois que vous ne voulez pas fermer le clavier lorsque l'utilisateur appuie sur UITextField lui-même. Donc, cette affaire doit être distinguée.

L'implémentation de la méthode handleTap ressemble à quelque chose comme-

/*
 In the text editing mode, listens to all taps occurring on the table view to exit the mode. There are two special cases to consider:
 a) Text field's clear button
 b) Text field
 */
-(void)handleTap:(UITapGestureRecognizer*)tapRecognizer 
{
    if(tapRecognizer.state == UIGestureRecognizerStateEnded) 
    {

            //Figure out where the user tapped
            CGPoint p = [tapRecognizer locationInView:textField];
            CGRect textFieldBounds = textField.bounds;
            CGRect clearButtonBounds = CGRectMake(textFieldBounds.Origin.x + textFieldBounds.size.width - 44, textFieldBounds.Origin.y, 44, textFieldBounds.size.height); 

            if(CGRectContainsPoint(clearButtonBounds, p))
                textField.text = @"";

            if(CGRectContainsPoint(textFieldBounds, p))
                return;

        [textField resignFirstResponder];
        //remove the tap gesture recognizer that was added.
        for(id element in self.tableView.gestureRecognizers)
        {
        if([element isKindOfClass:[UITapGestureRecognizer class]])
        {
            [self.tableView removeGestureRecognizer:element];
        }
        }
    }
        [self commitNewText];
    }
}

HTH. Marquez-le comme la réponse si vous l'aimez.

-Akshay

0
Akshay

Pour Swift, le moyen le plus facile de supprimer un clavier pour tous les champs de texte en appuyant n'importe où en dehors du champ de texte est:

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

Beaucoup de réponses ici, mais nous avons encore du mal à comprendre XCode 5 . Lisez ceci: https://developer.Apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/ GestureRecognizer_basics/GestureRecognizer_basics.html

Ajoutez une reconnaissance de gestes tactiles à votre UIScrollView. Définissez son délégué pour qu'il soit le contrôleur de vue.

Ajoutez cette méthode:

- (IBAction)tappedSomewhere:(id)sender {
    [self.view endEditing:YES];
}

votre code d’implémentation UIScrollView et associez-le à la reconnaissance de gestes tactiles en cliquant sur le code de mise en oeuvre et en le faisant glisser.

Travaillé pour moi.

0
Bill Noto

Dans xcode 5 Utilisez un Tap Gesture Recognizer et déclarez dans le .h avec action choisissez un nom et dans .m 

- (IBAction)backgroundTap:(id)sender {
    [self.view endEditing: YES];
}
0
gerachev