Je me demande comment faire disparaître le clavier lorsque l'utilisateur touche en dehors d'un UITextField
.
ios
cocoa-touch
uitextfield
uikit
jonepatr
la source
la source
Réponses:
Vous devrez ajouter un
UITapGestureRecogniser
et l'attribuer à la vue, puis appeler démissionner premier intervenant sur leUITextField
sélecteur on it.Le code:
In viewDidLoad
Dans le cas du clavier ignoré:
(Où
aTextField
est le champ de texte qui est responsable du clavier)La version Swift 3 ressemble à ça
Pour ignorer le clavier
la source
[aTextField resignFirstResponder]
ne serait[self.view endEditing:YES];
pas besoin d'une référence au champ de texte et fonctionnera pour plusieurs champs de texte[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
selon la réponse de @qiaoyi; J'ai eu un problème avec une table ne répondant pas aux sélections de lignes. 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(_:))))
J'ai mélangé quelques réponses.
Utilisez un ivar qui s'initialise pendant
viewDidLoad:
Ignorer ce qui est en cours d'édition:
la source
Vérifiez ceci, ce serait le moyen le plus simple de le faire,
Ou
Cette bibliothèque gérera notamment le défilement automatique de la barre de défilement, appuyez sur l'espace pour masquer le clavier, etc.
https://github.com/michaeltyson/TPKeyboardAvoiding
la source
Je constate que certaines personnes ont des problèmes avec la
UITapGestureRecognizer
méthode. Le moyen le plus simple que j'ai accompli cette fonctionnalité tout en laissant intact le comportement de tapotement de mon bouton existant est d'ajouter une seule ligne à la réponse de @ Jensen2k:Cela a permis à mes boutons existants de fonctionner sans utiliser la méthode de @Dmitry Sitnikov.
Lisez à ce sujet
property
ici (recherchezCancelsTouchesInView
): UIGestureRecognizer Class ReferenceJe ne sais pas comment cela fonctionnerait avec les barres de défilement, car je vois que certains avaient des problèmes, mais j'espère que quelqu'un d'autre pourrait rencontrer le même scénario que moi.
la source
UIImageView
, ajoutez[imageView setUserInteractionEnabled:NO];
et vous "cliquez dessus", ce qui fait que cette méthode fonctionne.Il est préférable de créer
UIView
une instance deUIControl
(dans le générateur d'interface), puis de connecter leurTouchUpInside
événement à ladismissKeyboard
méthode. CetteIBAction
méthode ressemblera à:la source
UITapGestureRecognizer
interféré en tapant sur les boutons à l'intérieur de la vue).touchesEnded
n'a pas fonctionné car il y a eu unUIScrollView
problème avec la chaîne de répondeurs.)Swift 4
Configurez votre
UIViewController
avec cette méthode d'extension une fois par exemple dansviewDidLoad
:et le clavier sera ignoré même en appuyant sur
NavigationBar
.la source
Version Swift, cela fonctionne en combinaison avec d'autres éléments (comme l'un
UIButton
ou l'autreUITextField
):la source
self
plutôt queself.view
canclesTouchesInView
est une propriété pratique à utiliser. Merci.c#
. FYI Ce point-virgule est autorisé par la syntaxe, ce n'est tout simplement pas nécessaire.Que diriez-vous de ceci: je sais que c'est un vieux poste. Cela pourrait aider quelqu'un :)
la source
C'est une bonne solution générique:
Objectif c:
Rapide:
Basé sur la solution @icodebuster: https://stackoverflow.com/a/18756253/417652
la source
Swift 4 oneliner
la source
Je pense que la façon la plus simple (et la meilleure) de le faire est de sous-classer votre vue globale et d'utiliser la
hitTest:withEvent
méthode pour écouter n'importe quelle touche. Les touches du clavier ne sont pas enregistrées, donc hitTest: withEvent n'est appelé que lorsque vous touchez / défiler / glissez / pincez ... ailleurs, puis appelez[self endEditing:YES]
.C'est mieux que d'utiliser
touchesBegan
cartouchesBegan
ne sont pas appelés si vous cliquez sur un bouton en haut de la vue. C'est mieux que celuiUITapGestureRecognizer
qui ne peut pas reconnaître un geste de défilement par exemple. C'est aussi mieux que d'utiliser un écran sombre car dans une interface utilisateur complexe et dynamique, vous ne pouvez pas mettre d'écran tamisé partout. De plus, il ne bloque pas les autres actions, vous n'avez pas besoin d'appuyer deux fois pour sélectionner un bouton à l'extérieur (comme dans le cas d'unUIPopover
).En outre, c'est mieux que d'appeler
[textField resignFirstResponder]
, car vous pouvez avoir de nombreux champs de texte à l'écran, donc cela fonctionne pour chacun d'eux.la source
Ce doit être le moyen le plus simple de cacher votre clavier en touchant l'extérieur:
(à partir de Comment fermer le clavier lorsque l'utilisateur touche une autre zone en dehors du champ de texte? )
la source
Si la vue est intégrée dans un,
UIScrollView
vous pouvez utiliser ce qui suit:Le premier animera le clavier hors écran lorsque la vue de la table défile et le dernier masquera le clavier comme l'application Messages standard.
la source
Vous pouvez le faire en utilisant le Storyboard dans XCode 6 et supérieur:
Créez l'action pour masquer le clavier
Ajoutez ceci au fichier d'en-tête de la classe utilisée par votre ViewController:
Ajoutez ensuite ceci au fichier d'implémentation du même ViewController:
Ce sera maintenant l'une des «Actions reçues» pour votre scène de storyboard (ie ViewController):
Connectez l'action à l'événement utilisateur
Vous devez maintenant connecter cette action au geste de l'utilisateur de toucher le clavier.
Important - Vous devez convertir la «UIView» contenue dans votre storyboard en UIControl , afin qu'il puisse recevoir des événements. Sélectionnez la vue dans votre hiérarchie View Controller Scene:
... et changez de classe:
Faites maintenant glisser le petit cercle à côté de «l'action reçue» pour votre scène, sur une partie «vide» de votre scène (en fait, vous faites glisser «l'action reçue» vers l'UIControl). Vous verrez une sélection d'événements auxquels vous pouvez connecter votre action:
Sélectionnez l'option «retouche à l'intérieur». Vous avez maintenant accroché l'IBAction que vous avez créée à une action utilisateur consistant à toucher le clavier. Lorsque l'utilisateur tape sur le clavier, il est désormais masqué.
(REMARQUE: pour accrocher l'action à l'événement, vous pouvez également faire glisser l'action reçue directement sur l'UIControl dans votre hiérarchie View Controllers. Elle est affichée en tant que «Contrôle» dans la hiérarchie.)
la source
Si je vous comprends bien, vous voulez démissionner en tapant sur le clavier de l'extérieur,
textfield
mais vous n'avez pas de référencetextfield
.Essaye ça;
reftextField
Maintenant,
textFieldDidBeginEditing
définissez le champ de texte référencé surMaintenant, vous pouvez l'utiliser avec plaisir sur n'importe quelle horloge de bouton (ajouter un bouton transparent au début de l'édition est recommandé)
Ou pour démissionner du bouton terminé, essayez ceci.
la source
Juste pour ajouter à la liste ici ma version de la façon de rejeter un clavier sur une touche extérieure.
viewDidLoad:
Nulle part:
la source
Beaucoup de bonnes réponses ici sur l'utilisation de -
UITapGestureRecognizer
tous lesUITextField
boutons effacer (X). La solution est de supprimer le reconnaisseur de gestes via son délégué:Ce n'est pas la solution la plus robuste mais elle fonctionne pour moi.
la source
return !touchViewIsButton
. Je suppose que tous les autres boutons qui doivent fermer le clavier devraient le faire dans leurs actions. De plus, TouchUpInside peut ne pas être appelé lorsque la disposition change lors de la fermeture du clavier.Vous pouvez créer une catégorie pour l'UiView et remplacer le meathod touchesBegan comme suit.
Cela fonctionne bien pour moi et c'est une solution centralisée pour ce problème.
la source
Version rapide de la réponse de @ Jensen2k:
Bon mot
la source
J'ai utilisé l'exemple de Barry pour mon nouveau développement. Cela a très bien fonctionné! mais j'ai dû inclure un léger changement, nécessaire pour ignorer le clavier uniquement pour le champ de texte en cours d'édition.
J'ai donc ajouté à l'exemple de Barry ce qui suit:
De plus, j'ai changé la méthode hideKeyboard comme suit:
la source
L'un des moyens les plus simples et les plus courts consiste à ajouter ce code à votre
viewDidLoad
la source
la source
J'ai essayé plusieurs des réponses ici et n'ai pas eu de chance. Mon identificateur de geste de prise de contact m'empêchait toujours
UIButtons
de répondre lorsqu'il était appuyé, même lorsque je réglaiscancelsTouchesInView
propriété de l’identificateur de geste sur NON.C'est ce qui a finalement résolu le problème:
Ayez un ivar:
Lorsqu'un champ de texte commence à être modifié, définissez la reconnaissance des gestes:
Ensuite, l'astuce consiste à configurer la
dismissKeyboard
méthode:Je suppose qu'il y a juste quelque chose à obtenir l'
dismissKeyboardSelector
exécution hors de la pile d'exécution de manipulation tactile ...la source
Envoyer un message
resignFirstResponder
au fichier texte qui l'a mis là. Veuillez consulter cet article pour plus d'informations.la source
Cela marche
Dans cet exemple, aTextField est le seul UITextField .... S'il y en a d'autres ou UITextViews, il y a un tout petit peu plus à faire.
la source
la source
Ajoutez ce code dans votre fichier ViewController.m :
la source
Dans ce cas, il peut être utilisé ScrollView et ajouté à
TextField
ScrollView et je veux appuyer surScrollView
et Afficher, puis ignorer le clavier. J'ai essayé de créer un exemple de code au cas où. Comme ça,Votre Storyboard Regardez ça comme.
la source
Vous pouvez utiliser la méthode UITapGestureRecongnizer pour fermer le clavier en cliquant en dehors d'UITextField. En utilisant cette méthode chaque fois que l'utilisateur clique en dehors de UITextField, le clavier est ignoré. Voici l'extrait de code pour l'utiliser.
la source
La définition du délégué de champs de texte dans la vue s'est chargée:
Ajouter cette fonction:
la source