Fermer le Clavier iOS en touchant n'importe où à l'aide de Swift
J'ai cherché partout mais je n'arrive pas à le trouver. Je sais comment faire pour faire disparaître le clavier à l'aide de Objective-C
mais je n'ai aucune idée de comment faire cela à l'aide de Swift
? Personne ne sait?
- Comment faites-vous cela en Objective-C? C'est normalement une conversion à partir d'une syntaxe à l'autre, et rarement une question de méthodes et de conventions.
- Je n'ai pas creusé dans Swift, mais j'étais sous l'impression de l'API est la même chose...
- Vous pouvez consulter cette réponse.
Vous devez vous connecter pour publier un commentaire.
Voici une autre façon de faire cette tâche si vous allez utiliser cette fonctionnalité dans plusieurs
UIViewControllers
:Maintenant, dans tous les
UIViewController
, tout ce que vous avez à faire est d'appeler cette fonction:Cette fonction est incluse comme une fonction standard dans mon repo qui contient beaucoup d'informations utiles Swift Extensions comme celui-ci, check it out: https://github.com/goktugyil/EZSwiftExtensions
tableView
ne fait pas partie de l'application peut être remplacé par tout autreview
.didSelectRowAtIndexPath
.tap.cancelsTouchesInView = false
. Qui a résolu pour moi au moins. Espérons que cela aide quelqu'untap.cancelsTouchesInView = false
view.endEditing(true)
partie pour N'Fin de l'Édition.Une réponse à votre question sur comment faire pour faire disparaître le clavier dans Xcode 6.1 utilisation de Swift ci-dessous:
(Source de cette information).
Vous pouvez appeler
sur toute instance de UIResponder, comme un UITextField. Si vous l'appelez sur le point de vue qui est actuellement en provoquant le clavier affiche alors le clavier de la rejeter.
Swift 4 travail
Créer l'extension comme ci-dessous & appel
hideKeyboardWhenTappedAround()
dans votre Base de-vue-contrôleur.pour Swift 3, il est très simple
si vous voulez cacher le clavier en appuyant sur la touche RETOUR
mais dans le second cas, vous devrez également passer délégué de tous les objets textfield pour le ViewController dans la Main.Storyboard
unrecognized selector sent to instance
avec ce code.Dash réponse est bonne et préféré. Plus de la "terre brûlée" approche consiste à appeler
view.endEditing(true)
. Cela provoqueview
et tous ses sous-vues àresignFirstResponder
. Si vous n'avez pas de référence à la vue que vous souhaitez rejeter, c'est un hacky mais la solution la plus efficace.Swift 3:
Manière la plus facile de rejeter clavier:
En storyboard:
Swift 3:
Extension avec
Selector
comme paramètre pour être en mesure de faire d'autres choses dans la rejeter fonction etcancelsTouchesInView
pour éviter la distorsion avec des touches sur les autres éléments de la vue.Utilisation:
![ comment faire pour désactiver le clavier..][1]
Si vous utilisez un parchemin de point de vue, Il pourrait être beaucoup plus simple.
Il suffit de sélectionner
Dismiss interactively
dans le storyboard.J'ai trouvé la meilleure solution inclus accepté la réponse de @Esqarrouth, avec quelques ajustements:
La ligne
tap.cancelsTouchesInView = false
est critique: il s'assure que laUITapGestureRecognizer
n'empêche pas d'autres éléments sur le point de vue de la réception de l'interaction de l'utilisateur.La méthode
dismissKeyboard()
a été changé pour un peu moins élégantdismissKeyboardView()
. C'est parce que dans mon projet assez ancien code, il y a de nombreux moments oùdismissKeyboard()
a déjà été utilisé (j'imagine que ce n'est pas rare), causant des problèmes de compilateur.Comme ci-dessus, ce comportement peut être activée dans la Vue individuelle Contrôleurs:
Dans Swift 4, ajouter @objc:
Dans le viewDidLoad:
Fonction:
Comme un programmeur novice, il peut être source de confusion lorsque les gens produisent plus qualifiés et inutile de réponses...Vous n'avez pas à faire des trucs compliqués indiqué ci-dessus!...
Ici est l'option la plus simple...Dans le cas de votre clavier apparaît en réponse à la textfield - à l'Intérieur de votre fonction d'écran tactile il suffit d'ajouter le resignFirstResponder fonction. Comme indiqué ci-dessous - le clavier de la fermer parce que le Premier Intervenant est sorti (sortie le Répondeur de la chaîne)...
Ce un liner démissionne Clavier de tous(tous) les UITextField dans une UIView
Rapide vous pouvez utiliser
Ajouter cette extension à votre ViewController :
J'ai utiliser IQKeyBoardManagerSwift pour le clavier. il est facile à utiliser.
juste Ajouter pod "IQKeyboardManagerSwift'
Importation IQKeyboardManagerSwift et écrire du code sur
didFinishLaunchingWithOptions
dansAppDelegate
.Je l'utilise toujours la suivante:
Ou même comme une extension:
De cette façon, dans le cas où la classe je suis en train d'annuler la modification n'a pas de
view
propriété ou n'est pas une sous-classe deUIView
je peux juste appelerUIApplication.endEditing(true)
.Pour Swift3
Enregistrer un événement logiciel de reconnaissance dans le viewDidLoad
ensuite, nous devons ajouter le geste à la voir dans la même viewDidLoad.
Alors nous avons besoin de l'initialiser les inscrits méthode
swift 5 seulement deux lignes est suffisant. Ajouter dans votre
viewDidLoad
devrait fonctionner.Si votre robinet geste bloqué certaines autres touches, puis ajoutez cette ligne:
Une autre possibilité est d'ajouter simplement un gros bouton avec aucun contenu qui se trouve en-dessous toutes les vues que vous pourriez avoir besoin de la toucher.
Lui donner une action intitulée:
Le problème avec un geste de reconnaissance a été pour moi, qu'il a également pris toutes les touches que je voulais pour recevoir par le tableViewCells.
Si vous avez d'autres points de vue qui doivent recevoir le toucher ainsi, vous avez à mettre
cancelsTouchesInView = false
Comme ceci:
Essayer,Ça fonctionne
Vous pouvez également ajouter un robinet geste de reconnaissance de démissionner du clavier. 😀
Quand il n'y a plus d'un champ de texte dans la vue
À suivre @modocache recommandation du pour éviter l'appel de
view.endEditing()
, vous pouvez garder une trace de la zone de texte qui est devenu l'intervenant de première ligne, mais c'est salissant et sujette à erreur.Une alternative est d'appeler
resignFirstResponder()
sur tous les champs de texte dans le viewcontroller. Voici un exemple de création d'une collection de tous les champs de texte (qui dans mon cas était nécessaire pour la validation de code de toute façon):Avec la collection disponible, il suffit de parcourir tous:
Alors maintenant, vous pouvez appeler
dismissKeyboard()
dans votre geste de reconnaissance de la (ou partout où cela est approprié pour vous). Inconvénient est que vous devez maintenir la liste deUITextField
s lorsque vous ajoutez ou supprimer des champs.Commentaires bienvenus. Si il y a un problème avec l'appel de
resignFirstResponder()
sur les contrôles qui ne sont pas de premier intervenant, ou si il ya un moyen facile et garantie de non-buggy moyen de suivre le courant du premier intervenant, je serais ravi de l'entendre!J'ai travaillé sur uisearchbar . Voir la mienne.
Je préfère cette one-liner:
Juste mis dans le remplacement viewDidLoad de la fonction dans n'importe quel sous-classé UIViewController vous le souhaitez, puis placez le code suivant dans un nouveau fichier vide dans votre projet appelé "UIViewController+dismissKeyboard.swift":
Je vous suis, fam
J'ai trouvé cette solution simple:
1. Ajouter UITapGestureRecognizer à votre vue-Contrôleur
2. Ajouter IBAction à votre UITapGestureRecognizer
3. Enfin, vous pouvez démissionner le premier intervenant
Voici une succincte façon de le faire:
Swift 3
De poster une nouvelle réponse depuis mon montage de @Roi-sorcier, la réponse a été rejetée.
Faire de votre classe un délégué de l'objet UITextField et remplacer touchesBegan.
Swift 4
Un Swift4 + RxSwift exemple (import RxGesture ainsi)
Juste une ligne de code dans
viewDidLoad()
méthode: