web-dev-qa-db-fra.com

Comment puis-je fermer le clavier si un utilisateur tape sur le clavier à l'écran?

Je veux pouvoir fermer le clavier de l'iPhone lorsque l'utilisateur appuie n'importe où en dehors du clavier. Comment puis-je m'y prendre? Je sais que je dois rejeter le répondeur, mais je dois savoir comment l'implémenter lorsqu'un utilisateur tape sur l'espace clavier.

42
Sheehan Alam

Vous devrez ajouter un UITapGestureRecogniser et l'affecter à la vue, puis appeler resign first responder sur le champ de texte de son sélecteur.

Le code:

Dans viewDidLoad

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                      action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];

Dans dismissKeyboard:

-(void)dismissKeyboard {
       [aTextField resignFirstResponder];
}

(Où aTextField est le champ de texte responsable du clavier)

OPTION 2

Si vous ne pouvez pas vous permettre d'ajouter un gestureRecognizer, vous pouvez essayer ceci

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];
    if(touch.phase == UITouchPhaseBegan) {
        [aTextField resignFirstResponder];
    }
}
80
visakh7

La solution la plus simple que j'ai utilisée est la suivante:

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

      [self.view endEditing:YES];

}

La commande endEditing peut être utilisée sur n'importe quelle vue contenant votre champ de texte en tant que sous-vue. L'autre avantage de cette méthode est que vous n'avez pas besoin de savoir quel champ de texte a déclenché le clavier. Donc, même si vous avez plusieurs champs de texte, ajoutez simplement cette ligne à la vue d'ensemble.

Basé sur la documentation Apple, je pense que cette méthode existe spécifiquement pour résoudre ce problème.

42
Taneem Tee

Ajoutez un TapGesture Recognizer mais assurez-vous que annelsTouchesInView = NO

UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(closeTextInput)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];
[tapGesture release];
16
Matt Rees

Vous devrez ajouter un UITapGestureRecogniser et l'affecter à la vue, puis appeler resign first responder sur le champ de texte de son sélecteur.

Le code:

In viewDidLoad

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                      action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];

Dans le clavier

-(void)dismissKeyboard {
       [self.view endEditing:true];
}
2
Suresh Kansujiya

Vous devez ajouter un UIVIew transparent en tant que sous-vue sous le clavier et y toucher pour gérer le clavier. Le code ci-dessous est pour votre référence.

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc]   initWithTarget:self action:@selector(overlayTouched:)]; 
gesture.delegate = self;
[(UITapGestureRecognizer *)gesture setNumberOfTouchesRequired:1];

UIView* trans = [[UIView alloc] initWithFrame:[[delegate view] bounds]];
[trans setOpaque:NO];
[trans setAutoresizingMask:UIViewAutoresizingFlexibleWidth |    UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin];
[trans setAlpha:0.3];
[trans setUserInteractionEnabled:YES];
trans.multipleTouchEnabled = YES;
[trans addGestureRecognizer:gesture];
[trans setBackgroundColor:[UIColor blackColor]];
[trans setTag:BLACK_SCREEN_VIEW];
1
Shreesh

Ceci est une solution Swift 4:

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

 self.view.addGestureRecognizer(tap)

Et le renvoyerClavier

@objc func dismissKeyboard() {
    self.view.endEditing(true)
}
1
Kimdv

Si vous ne souhaitez pas ajouter de reconnaissance de gestes, vous pouvez également utiliser la méthode touchesBegin

Code en Swift 4

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

0
Anu Mittal

Si vous êtes sur un UITableViewController ou avez un UITableView avec lequel l'utilisateur va interagir, dans votre ViewDidLoad vous pouvez simplement faire:

tableView.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag;

Remarque: il s'agit de la syntaxe Xamarin.iOS.

0
Adam Hockemeyer

Une autre façon de faire est simple:

Rend votre UIView as UIControl in custom class in the interface builder, vous pouvez ensuite attacher une méthode IBAction dans Touch up inside event de votre UIView : UIControl, puis vous mettez [yourTextField resignFirstResponder] à l'intérieur de IBAction method, comme ça:

- (IBAction) hideKeyboard: (id) sender
{
    // If you have more than one textfield to dismiss, of course only can be active 1, but here you can't know who is it, because sender will be the UIView : UIControl
    [alias resignFirstResponder];
    [password resignFirstResponder];
}

Ensuite, vous avez une autre option et c'est de mettre dans votre champ de texte the return key of the keyboard as Done (Cela peut être n'importe lequel de ceux que vous voulez, mais c'est bon pour cela, car retourner signifie faire une action avec le formulaire) dans le générateur d'interface, vous pouvez donc appuyer sur Done et masquer le clavier, mais dans ce cas, vous devez attacher la méthode IBAction précédente au Did end on exit un événement.

Et de cette façon, le clavier cachera touching outside ou en touchant Done depuis le clavier.

Si vous souhaitez améliorer le code, ne serait-ce que pour masquer le clavier touchant Done du clavier, la méthode devrait être:

// Attach all textFields here on Did end on exit event, will not work if touch outside the keyboard
- (IBAction) hideKeyboard: (id) sender
{
      [sender resignFirstResponder];
}
0
rokimoki