Cacher le clavier en perdant le focus sur un UITextView

J’ai donc un UITextView que j’utilise pour permettre à l’utilisateur de soumettre du texte.

Mon problème est que je n’arrive pas à comprendre comment autoriser l’utilisateur à «Annuler» en appuyant sur UITextView.

Simplifier la réponse de tuzzolotron : Où la prise suivante est correctement connectée dans votre xib

IBOutlet UITextView *myTextView; 

Utilisez ceci dans le contrôleur de vue:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; if ([myTextView isFirstResponder] && [touch view] != myTextView) { [myTextView resignFirstResponder]; } [super touchesBegan:touches withEvent:event]; } 

Si vous appuyez sur la vue du contrôleur de vue, en dehors de la vue texte, le premier répondant répondra en fermant le clavier.

Une autre approche que j’ai beaucoup utilisée lorsque je travaillais avec UITableViews, Searchbar et le clavier est la suivante: je pense que vous pouvez l’appliquer à un champ de texte

 UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)]; [self.tableView addGestureRecognizer:gestureRecognizer]; gestureRecognizer.cancelsTouchesInView = NO; // this prevents the gesture recognizers to 'block' touches [gestureRecognizer release]; 

Et puis, voici la fonction de rappel simple

 - (void)hideKeyboard { [myTextField resignFirstResponder]; } 

J’espère que cela aide

À mon avis:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; // pass touches up to viewController [self.nextResponder touchesBegan:touches withEvent:event]; } 

Dans mon viewcontroller:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; if (keyboardShown && [touch view] != self.TextView) { [self.TextView resignFirstResponder]; } [super touchesBegan:touches withEvent:event]; } - (void)keyboardWasShown:(NSNotification*)aNotification { keyboardShown = YES; } 

Ceci est un ancien message, mais j’implémentais cette solution quand j’ai trouvé quelque chose de beaucoup plus simple (peut-être que ce n’était pas disponible à l’époque).

[self.myTextView endEditing: OUI];

J’utilise un UITableView, alors je mets cette ligne sur la méthode didSelectRowAtIndexPath: Jusqu’ici tout va bien…

Voici le code swift 3

 override func touchesBegan(_ touches: Set, with event: UIEvent?) { if let touch = touches.first { if textField.isFirstResponder && touch.view != textField { textField.resignFirstResponder() } } super.touchesBegan(touches, with: event) } 

Voici une meilleure solution qui ne dépend pas d’un sharepoint vente et qui fonctionnera avec un nombre quelconque d’objects UITextField dans votre contrôleur.

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; if (![[touch view] isKindOfClass:[UITextField class]]) { [self.view endEditing:YES]; } [super touchesBegan:touches withEvent:event]; } 

Très facile

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 
 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { var touch = event.allTouches()?.anyObject() as UITouch if( textfield.isFirstResponder() && touch.view != textfield) { textfield.resignFirstResponder() NSLog("Resigning first responder since touches began outside") } super.touchesBegan(touches, withEvent: event) } 

La réponse d’Ohhorob a fonctionné pour moi aussi. Voici le simple équivalent rapide.

Je voulais une version de ce qui a fonctionné pour démissionner de n’importe quel sharepoint vue, sans nécessiter de points de vente spécifiques pour chacun.

Il utilise MonoTouch C #, mais il devrait être évident de le convertir en Objective-C

  private void findAndResignFirstResponder(UIView node=null) { if (node == null) { return; } if (node.IsFirstResponder) { node.ResignFirstResponder(); return; } foreach (UIView view in node.Subviews) { findAndResignFirstResponder(node:view); } } private bool haveDrag = false; public override void TouchesEnded(NSSet touches, UIEvent evt) { if (!haveDrag) { UITouch touch = (UITouch)evt.AllTouches.AnyObject; if (!touch.View.CanBecomeFirstResponder) { this.findAndResignFirstResponder(this); Console.WriteLine("resign"); } } base.TouchesEnded (touches, evt); } public override void TouchesMoved(NSSet touches, UIEvent evt) { haveDrag = true; base.TouchesMoved (touches, evt); } public override void TouchesBegan(NSSet touches, UIEvent evt) { haveDrag = false; base.TouchesBegan (touches, evt); } 

Ma façon de le faire …

  • Ajoutez une référence au TextView dans l’interface @ de votre ViewController:

     @property (weak, nonatomic) IBOutlet UITextView *yourTextView; 
  • Remplacez cette méthode dans la mise en œuvre de votre ViewController:

     - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { if ([self.yourTextView isFirstResponder]) { [self.yourTextView resignFirstResponder]; } }