iOS - Rejeter clavier au toucher et à l'extérieur de l'objet UITextField
Je me demandais comment faire le clavier disparaissent lorsque l'utilisateur touche l'extérieur d'un UITextField
.
- Dmitri avait la bonne réponse. Ce n'est pas un geste problème - un problème de donner sa démission, le premier intervenant. Dmirty la réponse est aussi la solution recommandée par Marque, Nutting et LeMarche dans au Début iOS 4 Développement, Chapitre 4, page 83.
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin d'ajouter un
UITapGestureRecogniser
et l'affecter à la vue, et ensuite appeler démissionner premier intervenant sur leUITextField
sur le sélecteur.Le code:
Dans le viewDidLoad
Dans dismissKeyboard:
(Où
aTextField
est le champ qui est responsable pour le clavier)Swift 3 version ressemble à ça
Pour dismissKeyboard
- (void)textFieldDidBeginEditing:(UITextField *)textField { textFieldToResign = textField; }
cela aidera à démissionner sélectionné textField[aTextField resignFirstResponder]
serait[self.view endEditing:YES];
il n'a pas besoin d'une référence pour le champ de texte et va travailler pour plusieurs objets textfield[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
par @qiaoyi 's réponse; j'ai eu un problème avec un tableau ne répond pas à la ligne des sélections. 5 ans plus tard, j'espère que cela aide quelqu'un d'autre.self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
endEditing
– Si la force paramètre est défini sur true, le champ de texte est même jamais demandé de démissionner. Il est donc préférable de:view.endEditing(false)
addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(endEditing(_:))))
J'ai de la purée de quelques réponses.
Utiliser un ivar qui est initialisé lors de
viewDidLoad:
Rejeter ce que jamais est en cours de modification:
Le vérifier, ce serait le meilleur moyen de le faire,
Ou
Cette bibliothèque va gérer y compris la barre de défilement le défilement automatique, appuyez sur espace pour masquer le clavier, etc...
https://github.com/michaeltyson/TPKeyboardAvoiding
Je vois que certaines personnes sont d'avoir des problèmes à l'aide de la
UITapGestureRecognizer
méthode. La façon la plus simple que j'ai accompli cette fonctionnalité, tout en laissant de mon bouton tap de comportement intacte est l'ajout d'une seule ligne à @Jensen2k 's réponse:Ce qui m'a permis boutons existants de fonctionner sans l'aide de @Dimitri Sitnikov s 'méthode.
Lire à ce sujet
property
ici (recherche deCancelsTouchesInView
): UIGestureRecognizer De Référence De ClasseJe ne suis pas sûr de savoir comment cela fonctionnerait avec les barres de défilement, comme je vois que certains ont des problèmes avec, mais j'espère que quelqu'un d'autre pourrait l'exécuter dans le même scénario que j'ai eu.
UIImageView
, ajouter[imageView setUserInteractionEnabled:NO];
et vous "cliquez", qui font de cette méthode de travail.Il est préférable de faire votre
UIView
une instance deUIControl
(dans interface builder) et puis se connecter à leurTouchUpInside
événement àdismissKeyboard
méthode. CetteIBAction
méthode ressemblera à:UITapGestureRecognizer
interféré avec appuyant sur les boutons à l'intérieur de la vue).touchesEnded
n'a pas fonctionné parce qu'il y avait unUIScrollView
de jouer avec le répondeur de la chaîne.)-dismissKeyboard
.Swift version, cela fonctionne en combinaison avec d'autres éléments (comme un
UIButton
ou d'une autreUITextField
):self
plutôt queself.view
canclesTouchesInView
est une pratique de la propriété à utiliser. Merci.c#
. FYI Que le point-virgule est de la syntaxe autorisée, il n'est tout simplement pas nécessaire.Swift 4
Installation de votre
UIViewController
avec cette méthode d'extension une fois que les e.g dansviewDidLoad
:et le clavier sera rejetée même en appuyant sur le
NavigationBar
.Comment à ce sujet: je sais que c'est un vieux post. Il pourrait aider quelqu'un 🙂
C'est une bonne solution générique:
Objective-C:
Swift:
Basé sur @icodebuster solution: https://stackoverflow.com/a/18756253/417652
Swift 4 oneliner
Je pense que le plus simple (et la meilleure) façon de le faire est à la sous-classe votre point de vue global et l'utilisation
hitTest:withEvent
méthode d'écouter n'importe quelle touche. Touche sur le clavier ne sont pas enregistrées, de sorte que hitTest:withEvent n'est appelée que lorsque vous touche de défilement//glisser/pincement... quelque part d'autre, puis d'appeler[self endEditing:YES]
.C'est mieux que d'utiliser
touchesBegan
parce quetouchesBegan
ne sont pas appelés, si vous cliquez sur un bouton situé sur le haut de la vue. C'est mieux queUITapGestureRecognizer
qui ne peut pas reconnaître un mouvement de défilement, par exemple. Il est également préférable que l'utilisation d'un dim écran parce que dans une, complexe et dynamique de l'interface utilisateur, vous ne pouvez pas mettre dim écran partout. En outre, il ne bloque pas les autres actions, vous n'avez pas besoin de tapez deux fois pour sélectionner un bouton à l'extérieur (comme dans le cas d'unUIPopover
).Aussi, c'est mieux que d'appeler
[textField resignFirstResponder]
, parce que vous pouvez avoir beaucoup de champs de texte à l'écran, de sorte que cela fonctionne pour tous les d'entre eux.Ce doit être la façon la plus simple de cacher votre clavier en touchant l'extérieur :
(à partir de Comment faire pour faire disparaître le clavier lorsque l'utilisateur appuyez sur une autre zone à l'extérieur de textfield?)
Vous pouvez faire cela en utilisant la table de montage séquentiel dans XCode 6 et au-dessus:
Créer l'action pour masquer le clavier
Ajoutez à cela le fichier d'en-tête de la classe utilisée par votre ViewController:
Puis l'ajouter à la mise en œuvre de fichier de la même ViewController:
Ce sera désormais l'un des "Reçus Actions" pour votre storyboard de la scène (c'est à dire ViewController):
Crochet jusqu'à l'action de l'utilisateur événement
Maintenant, vous avez besoin pour accrocher cette action de l'utilisateur geste de toucher du clavier.
Important - Vous avez besoin de convertir le "UIView" qui est contenue dans votre storyboard pour un UIControl, de sorte qu'il peut recevoir des événements. Sélectionnez la vue à partir de votre point de Vue Contrôleur de Scène hiérarchie:
...et le changement de sa classe:
Maintenant, faites glisser le petit cercle à côté de "reçu d'action" pour votre scène, sur un 'vide' une partie de votre scène (en fait vous êtes glisser le Reçu de l'Action " pour la UIControl). Vous verrez une sélection d'événements que vous pouvez accrocher à votre action:
Sélectionnez la touche à l'intérieur de l'option. Vous avez maintenant accroché le IBAction vous avez créé à une action de l'utilisateur de toucher du clavier. Lorsque l'utilisateur tape sur le clavier, il va maintenant être caché.
(REMARQUE: Pour associer l'action à l'événement, vous pouvez également faire glisser à partir de la réception de l'action directement sur le UIControl à votre avis, les Contrôleurs de la hiérarchie. Il est affiché comme "Contrôle" dans la hiérarchie.)
Si je vous suis, à droite, vous souhaitez démissionner clavier wile tapant sur l'extérieur de
textfield
mais vous n'avez pas la référence de votretextfield
.Essayer ce;
reftextField
Maintenant dans
textFieldDidBeginEditing
ensemble référencé champ de texte pourMaintenant, vous pouvez heureusement utiliser sur n'importe quel bouton de l'horloge, (ajout d'un bouton transparent sur de commencer l'édition recommandés)
Ou de sa démission bouton terminé, essayez ceci.
Si la vue est incorporé dans un
UIScrollView
ensuite, vous pouvez utiliser les éléments suivants:L'ancien animer le clavier hors de l'écran lors de l'affichage de la table est défilé et le plus tard sera de cacher le clavier comme le stock des Messages de l'application.
Juste pour ajouter à la liste ici ma version de comment faire disparaître un clavier à l'extérieur de toucher.
viewDidLoad:
N'importe où:
Beaucoup de bonnes réponses ici sur l'utilisation de
UITapGestureRecognizer
, qui tous casserUITextField
's clair (X) bouton. La solution est de supprimer le geste de reconnaissance par l'intermédiaire de son délégué:C'est pas le plus robuste solution, mais cela fonctionne pour moi.
return !touchViewIsButton
. Je suppose que tout les autres boutons qui doivent fermer le clavier devrait le faire dans leurs actions. En outre TouchUpInside peut pas appelée lorsque les modifications de mise en page sur le clavier de licenciement.Vous pouvez créer une catégorie pour les UiView et remplacer le touchesBegan meathod comme suit.
Il fonctionne très bien pour moi.Et il est de centraliser la solution à ce problème.
Swift version de @Jensen2k réponse:
Un liner
J'ai utilisé Barry exemple pour mon nouveau développement. Il fonctionnait très bien! mais j'ai dû inclure un peu de changement, nécessaire pour faire disparaître le clavier uniquement pour la zone de texte en cours d'édition.
Donc, j'ai ajouté à Barry exemple les éléments suivants:
Aussi, j'ai changé hideKeyboard méthode comme suit:
L'un des plus facile et plus court est d'ajouter ce code à votre
viewDidLoad
J'ai essayé beaucoup de réponses ici et n'avait pas de chance. Mon robinet est un geste de reconnaissance a toujours été la cause de mes
UIButtons
ne répond pas lorsque vous appuyez dessus, même quand j'ai mis lecancelsTouchesInView
propriété de la geste de reconnaissance à PAS.C'est ce qui est finalement résolu le problème:
Ont un ivar:
Lorsqu'un champ de texte commence à modifier, régler le geste de reconnaissance:
Alors le truc, c'est la façon dont vous avez configuré le
dismissKeyboard
méthode:Je pense qu'il y a juste quelque chose au sujet de l'obtention de la
dismissKeyboardSelector
d'exécution hors de la touche de la manipulation de pile d'exécution...Envoyer un message
resignFirstResponder
à la textfiled qui l'a mis là. Veuillez voir ce post pour plus d'informations.Cela fonctionne
Dans cet exemple, aTextField est le seul objet UITextField.... Si il y a d'autres ou UITextViews, il y a un tout petit peu plus à faire.
Ajouter ce code dans votre ViewController.m fichier :
Dans ce cas, il peut être utiliser ScrollView et ajouté à
TextField
dans le ScrollView et je veux Appuyez sur laScrollView
et de la Vue, puis fermer le Clavier. J'ai essayé de créer un exemple de code juste au cas où. Comme ça,Votre Storyboard Regarder que Comme.
Vous pouvez utiliser UITapGestureRecongnizer méthode pour rejetant clavier en cliquant à l'extérieur de l'objet UITextField. En utilisant cette méthode, à chaque fois que l'utilisateur va cliquer en dehors de UITextField puis clavier obtiendrez d'ignorer. Ci-dessous l'extrait de code pour l'utiliser.
Ensemble des champs de texte délégué en vue, ne charge:
Ajouter cette Fonction:
Pour ceux qui luttent avec cette Swift. C'est accepté de répondre par Jensen2k mais en Swift.
Swift 2.3
suffit d'utiliser ce code dans votre .m de fichier c'est abandonner le champ de texte lorsque l'utilisateur appuyez à l'extérieur de la zone de texte.
Donc j'ai juste eu à résoudre ce problème, et aucune des réponses précédentes a fonctionné pour moi hors de la boîte. Ma situation: un
UISearchBar
, plus un certain nombre d'autres commandes sur l'écran. Je veux pour un robinet à l'extérieur de la barre de recherche pour fermer le clavier, mais pas se propager à toute les autres contrôles. Lorsque le clavier est caché, je veux que tous les contrôles de travailler.Ce que j'ai fait:
1) mettre en Œuvre une touche personnalisée gestionnaire de mon point de vue contrôleur.
2) Ajout d'un couple de délégué méthodes (les miennes sont pour la UISearchBar, mais il y a d'autres semblables pour objet UITextField).
controlContainerView
dans le code ci-dessous est une UIView qui a un tas de boutons en elle. Rappelez-vous que le réglage deuserInteractionEnabled
sur un superview désactive tous ses sous-vues.Dans le viewDidLoad
swift 4.2
Le code comme ceci