Un moyen facile de supprimer le clavier?

J’ai plusieurs contrôles dispersés dans de nombreuses cellules de table de ma table, et je me demandais s’il y avait un moyen plus facile de supprimer le clavier sans avoir à parcourir toutes les commandes et à les renvoyer en premier. Je suppose que la question est .. Comment pourrais-je obtenir le premier répondant actuel au clavier?

Essayer:
[self.view endEditing:YES];

Vous pouvez forcer la vue en cours de modification à renoncer à son statut de premier répondeur avec [view endEditing:YES] . Cela cache le clavier.

Contrairement à -[UIResponder resignFirstResponder] , -[UIView endEditing:] effectuera une recherche dans les sous-vues pour trouver le premier répondant actuel. Vous pouvez donc l’envoyer à votre vue de niveau supérieur (par exemple, self.view dans un UIViewController ) et cela fera le bon choix.

(Cette réponse incluait auparavant quelques autres solutions, qui fonctionnaient également mais étaient plus compliquées que nécessaire. Je les ai supprimées pour éviter toute confusion.)

Vous pouvez envoyer une action ciblée nulle à l’application, elle démissionnera à tout moment sans avoir à se soucier de la vue qui a le statut de premier répondant.

Objectif c:

 [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]; 

Swift 3.0:

 UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil) 

Nil actions ciblées sont communes sur Mac OS X pour les commandes de menu, et voici une utilisation pour eux sur iOS.

Pour être honnête, je ne suis folle d’aucune des solutions proposées ici. J’ai trouvé une bonne façon d’utiliser un TapGestureRecognizer qui, selon moi, va au coeur de votre problème: lorsque vous cliquez sur un élément autre que le clavier, fermez le clavier.

  1. Dans viewDidLoad, inscrivez-vous pour recevoir des notifications au clavier et créez un UITapGestureRecognizer:

     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil]; [nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil]; tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)]; 
  2. Ajouter le clavier afficher / masquer les répondeurs. Là vous ajoutez et enlevez le TapGestureRecognizer à l’UIView qui devrait écarter le clavier quand tapé. Remarque: il n’est pas nécessaire de l’append à toutes les sous-vues ou commandes.

     -(void) keyboardWillShow:(NSNotification *) note { [self.view addGestureRecognizer:tapRecognizer]; } -(void) keyboardWillHide:(NSNotification *) note { [self.view removeGestureRecognizer:tapRecognizer]; } 
  3. Le TapGestureRecognizer appellera votre fonction quand il y aura un tapotement et vous pourrez fermer le clavier comme ceci:

     -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer { [textField resignFirstResponder]; } 

La bonne chose à propos de cette solution est qu’elle ne filtre que pour les robinets, pas les balayages. Donc, si vous avez un contenu défilant au-dessus du clavier, les glissements défilent quand même et laissent le clavier affiché. En supprimant le dispositif de reconnaissance des gestes après le départ du clavier, les futurs clics de votre vue sont traités normalement.

Ceci est une solution pour que le clavier disparaisse lorsque vous appuyez sur la touche return dans n’importe quel champ de texte, en ajoutant du code à un seul endroit (il n’est donc pas nécessaire d’append un gestionnaire pour chaque champ de texte):


considérez ce scénario:

J’ai un viewcontroller avec deux viewcontroller de viewcontroller (nom d’utilisateur et mot de passe). et le viewcontroller implémente le protocole UITextFieldDelegate

Je le fais dans viewDidLoad

 - (void)viewDidLoad { [super viewDidLoad]; username.delegate = self; password.delegate = self; } 

et le viewcontroller implémente la méthode optionnelle comme

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

et quel que soit le champ de texte dans lequel vous vous trouvez, dès que j’appuie sur la touche return du clavier, elle est rejetée!

Dans votre cas, la même chose fonctionnerait tant que vous définissez tous les delegates du champ de texte sur vous-même et implémentez textFieldShouldReturn

Une meilleure approche consiste à faire en sorte que quelque chose «vole» le statut de premier répondant.

Comme UIApplication est une sous-classe de UIResponder, vous pouvez essayer:

 [[UIApplication sharedApplication] becomeFirstResponder] [[UIApplication sharedApplication] resignFirstResponder] 

À défaut, créez un nouvel object UITextField avec un cadre de taille zéro, ajoutez-le à une vue quelque part et faites quelque chose de similaire (devenez suivi d’une démission).

Ranger ceci dans une classe d’utilité.

 + (void)dismissKeyboard { [self globalResignFirstResponder]; } + (void) globalResignFirstResponder { UIWindow * window = [[UIApplication sharedApplication] keyWindow]; for (UIView * view in [window subviews]){ [self globalResignFirstResponderRec:view]; } } + (void) globalResignFirstResponderRec:(UIView*) view { if ([view respondsToSelector:@selector(resignFirstResponder)]){ [view resignFirstResponder]; } for (UIView * subview in [view subviews]){ [self globalResignFirstResponderRec:subview]; } } 

@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:

Absolument shiny!

Je vous remercie.

Compte tenu de vos conseils et des conseils des autres dans ce fil, voici ce que j’ai fait:

A quoi ça ressemble quand on l’utilise:

[[self appDelegate] dismissKeyboard]; (note: j’ai ajouté appDelegate comme ajout à NSObject pour que je puisse utiliser n’importe où)

A quoi ça ressemble sous le capot:

 - (void)dismissKeyboard { UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease]; tempTextField.enabled = NO; [myRootViewController.view addSubview:tempTextField]; [tempTextField becomeFirstResponder]; [tempTextField resignFirstResponder]; [tempTextField removeFromSuperview]; } 

MODIFIER

Modification de ma réponse à tempTextField.enabled = NO; . La désactivation du champ de texte empêchera l’ UIKeyboardWillShowNotification notifications au clavier UIKeyboardWillShowNotification et UIKeyboardWillHideNotification si vous comptez sur ces notifications tout au long de votre application.

Beaucoup de réponses trop compliquées ici, peut-être parce que ce n’est pas facile à trouver dans la documentation iOS. JosephH l’avait juste au dessus:

 [[view window] endEditing:YES]; 

Conseil rapide sur la façon de supprimer le clavier dans iOS lorsqu’un utilisateur touche n’importe où sur l’écran en dehors du clavier UITOUTField ou du clavier. Compte tenu de la quantité de biens immobiliers que le clavier iOS peut occuper, il est judicieux que vos utilisateurs puissent utiliser le clavier de manière simple et intuitive.

Voici un lien

Encore plus simple que la réponse de Meagar

écraser touchesBegan:withEvent:

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

Cela fermera dismiss the keyboard lorsque vous touchez n’importe où en backgroundbackground .

Dans le fichier d’en-tête de votre contrôleur de vue, ajoutez à la définition de l’interface de votre contrôleur afin qu’elle soit conforme au protocole délégué UITextField …

 @interface someViewController : UIViewController  

… Dans le fichier d’implémentation du contrôleur (.m), ajoutez la méthode suivante ou le code à l’intérieur si vous avez déjà une méthode viewDidLoad …

 - (void)viewDidLoad { // Do any additional setup after loading the view, typically from a nib. self.yourTextBox.delegate = self; } 

… Ensuite, liez votreTextBox à votre champ de texte réel

 - (BOOL)textFieldShouldReturn:(UITextField *)theTextField { if (theTextField == yourTextBox) { [theTextField resignFirstResponder]; } return YES; } 

Voici ce que j’utilise dans mon code. Il fonctionne comme un charme!

Dans yourviewcontroller.h, ajoutez:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Maintenant, dans le fichier .m, ajoutez ceci à votre fonction ViewDidLoad:

 - (void)viewDidLoad { //Keyboard stuff tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)]; tapRecognizer.cancelsTouchesInView = NO; [self.view addGestureRecognizer:tapRecognizer]; } 

Ajoutez également cette fonction dans le fichier .m:

 - (void)handleSingleTap:(UITapGestureRecognizer *) sender { [self.view endEditing:YES]; } 

Vous devriez envoyer endEditing: à la fenêtre de travail étant la sous-classe de UIView

 [[UIApplication sharedApplication].windows.firstObject endEditing:NO]; 

La meilleure façon de supprimer le clavier de UITableView et UIScrollView est la suivante:

 tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag 

En swift 3, vous pouvez faire ce qui suit

 UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) 

La réponse de Jeremy ne fonctionnait pas vraiment pour moi, je pense que j’avais une stack de navigation dans un onglet avec une boîte de dialog modale au-dessus. J’utilise ce qui suit et cela fonctionne pour moi, mais votre kilométrage peut varier.

  // dismiss keyboard (mostly macro) [[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord // --- dismiss keyboard (in indexAppDelegate.h) (mostly macro) - (void)dismissKeyboard; // --- dismiss keyboard (in indexAppDelegate.m) (mostly macro) // do this from anywhere to dismiss the keybard - (void)dismissKeyboard { // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero]; UIViewController *myRootViewController = < #viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called. Probably is a way to determine this progragrammatically) UIViewController *uivc; if (myRootViewController.navigationController != nil) { // for when there is a nav stack uivc = myRootViewController.navigationController; } else { uivc = myRootViewController; } if (uivc.modalViewController != nil) { // for when there is something modal uivc = uivc.modalViewController; } [uivc.view addSubview:tempTextField]; [tempTextField becomeFirstResponder]; [tempTextField resignFirstResponder]; [tempTextField removeFromSuperview]; [tempTextField release]; } 

Vous devrez peut-être également remplacer UIViewController disablesAutomaticKeyboardDismissal pour que cela fonctionne dans certains cas. Cela peut être fait sur le UINavigationController si vous en avez un.

Sous-classe vos champs de texte … et aussi les vues de texte

Dans la sous-classe mettez ce code ..

 -(void)conformsToKeyboardDismissNotification{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil]; } -(void)deConformsToKeyboardDismissNotification{ [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil]; } - (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; [self resignFirstResponder]; } 

Dans les champs de texte (de même pour les delegates textview)

 -(void)textFieldDidBeginEditing:(JCPTextField *)textField{ [textField conformsToKeyboardDismissNotification]; } - (void)textFieldDidEndEditing:(JCPTextField *)textField{ [textField deConformsToKeyboardDismissNotification]; } 

Tous ensemble .. Maintenant, postez simplement la notification depuis n’importe où dans votre code. Il résignera n’importe quel clavier.

Et rapidement nous pouvons faire

 UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil) 

Pour écarter un clavier une fois que le clavier est sorti, il y a 2 cas ,

  1. lorsque UITextField se trouve dans un UIScrollView

  2. lorsque UITextField est en dehors d’un UIScrollView

2.lorsque UITextField est en dehors d’un UIScrollView, remplacez la méthode dans votre sous-classe UIViewController

vous devez également append un délégué pour tout UITextView

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 
  1. Dans une vue de défilement, le tapotage extérieur ne déclenche aucun événement . Dans ce cas, utilisez un outil de reconnaissance des mouvements , glissez-déposez un object UITapGesture pour la vue de défilement et créez un IBAction correspondant .

Pour créer une IBAction, appuyez sur Ctrl + cliquez sur UITapGesture et faites-la glisser dans le fichier .h de viewcontroller.

Ici, j’ai nommé tappedEvent comme nom de mon action

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

les informations ci-dessus ont été obtenues à partir du lien suivant, veuillez vous référer pour plus d’informations ou contactez-moi si vous ne comprenez pas les données ci-dessus.

http://samwize.com/2014/03/27/dismiss-keyboard-whentap-outside-a-uitextfield-slash-uitextview/

Je déteste qu’il n’y ait pas de moyen “global” de supprimer le clavier par programmation sans utiliser des appels d’API privés. Fréquemment, j’ai besoin de supprimer le clavier par programmation sans savoir quel object est le premier répondant. J’ai eu recours à l’inspection de l’ self à l’aide de l’API d’exécution Objective-C, en énumérant toutes ses propriétés, en extrayant celles de type UITextField et en leur envoyant le message resignFirstResponder .

Ça ne devrait pas être si difficile de faire ça …

Ce n’est pas joli, mais la façon dont je démissionne le premier répondeur alors que je ne sais pas ce que le répondeur est:

Créez un object UITextField, soit dans IB, soit par programme. Rendez-le caché. Reliez-le à votre code si vous l’avez fait dans IB. Ensuite, lorsque vous souhaitez supprimer le clavier, vous basculez le répondeur sur le champ de texte invisible et vous le démettez immédiatement:

  [self.invisibleField becomeFirstResponder]; [self.invisibleField resignFirstResponder]; 

Vous pouvez effectuer une itération récursive dans les sous-vues, stocker un tableau de tous les UITextFields, puis les parcourir et les renvoyer tous.

Pas vraiment une bonne solution, surtout si vous avez beaucoup de sous-vues, mais pour les applications simples, cela devrait faire l’affaire.

J’ai résolu ce problème d’une manière beaucoup plus compliquée, mais beaucoup plus performante, mais en utilisant un singleton / manager pour le moteur d’animation de mon application, et chaque fois qu’un champ de texte devenait le répondeur, je l’assignerais à un balayé (démissionné) sur la base de certains autres événements … c’est presque impossible pour moi d’expliquer dans un paragraphe.

Soyez créatif, il ne m’a fallu que 10 minutes pour réfléchir à mon application après avoir trouvé cette question.

Une méthode légèrement plus robuste que je devais utiliser récemment:

 - (void) dismissKeyboard { NSArray *windows = [UIApplication sharedApplication].windows; for(UIWindow *window in windows) [window endEditing:true]; // Or if you're only working with one UIWindow: [[UIApplication sharedApplication].keyWindow endEditing:true]; } 

J’ai trouvé que certaines des autres méthodes “globales” ne fonctionnaient pas (par exemple, UIWebView et WKWebView refusaient de démissionner).

Ajoutez un outil de reconnaissance des gestes à vos vues. Et définissez-le ibaction

votre fichier .m sera comme

  - (IBAction)hideKeyboardGesture:(id)sender { NSArray *windows = [UIApplication sharedApplication].windows; for(UIWindow *window in windows) [window endEditing:true]; [[UIApplication sharedApplication].keyWindow endEditing:true]; } 

Ça a fonctionné pour moi

Oui, endEditing est la meilleure option. Et depuis iOW 7.0, UIScrollView a une fonctionnalité intéressante pour supprimer le clavier lors de l’interaction avec la vue de défilement. Pour ce faire, vous pouvez définir la propriété keyboardDismissMode de UIScrollView .

Définissez le mode d’exclusion du clavier comme suit:

 tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag 

Il a peu d’autres types. Jetez un coup d’œil à ce document d’Apple .

En swift:

 self.view.endEditing(true) 

le plus simple est d’appeler la méthode

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if(![txtfld resignFirstResponder]) { [txtfld resignFirstResponder]; } else { } [super touchesBegan:touches withEvent:event]; } 

Vous devez utiliser l’une de ces méthodes,

 [self.view endEditing:YES]; 

ou

 [self.textField resignFirstResponder];