J'ai pas mal de contrôles dispersés dans de nombreuses cellules de tableau dans mon tableau, et je me demandais s'il y avait un moyen plus simple de fermer le clavier sans avoir à parcourir tous mes contrôles et à les démissionner tous en tant que premier répondeur. Je suppose que la question est .. Comment pourrais-je obtenir le premier répondeur actuel au clavier?
objective-c
cocoa-touch
sdk
Seventoes
la source
la source
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Réponses:
Essayer:
la source
[self.view endEditing:YES];
comme les valeurs BOOL sont OUI / NON dans Objective-C.Vous pouvez forcer la vue en cours de modification à abandonner son statut de premier répondant avec
[view endEditing:YES]
. Cela cache le clavier.Contrairement à
-[UIResponder resignFirstResponder]
,-[UIView endEditing:]
recherche dans les sous-vues pour trouver le premier répondant actuel. Vous pouvez donc l'envoyer à votre vue de niveau supérieur (par exempleself.view
dans aUIViewController
) et il fera la bonne chose.(Cette réponse incluait auparavant quelques autres solutions, qui ont également fonctionné mais étaient plus compliquées que nécessaire. Je les ai supprimées pour éviter toute confusion.)
la source
[self.view endEditing:YES];
réponse est meilleure.[UIView endediting:]
marche. Dans l'une des applications que j'ai développées, une zone de recherche a été ajoutée dans UINavigationViewController, si vous appelez simplement[self.view endEditing:YES]
, en tant queself
contrôleur de vue, cela ne fonctionnera pas, à la place, j'ai appelé cette méthode directement dans la portée de la vue où la zone de recherche a été ajoutée, par exemple:[self.mySearchBoxView endEditing:YES]
.Vous pouvez envoyer une action ciblée nulle à l'application, elle démissionnera à tout moment sans avoir à vous soucier de la vue qui a actuellement le statut de premier répondant.
Objectif c:
Swift 3.0:
Aucune action ciblée n'est courante sur Mac OS X pour les commandes de menu, et en voici une utilisation sur iOS.
la source
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, je pense, va au cœur de votre problème: lorsque vous cliquez sur autre chose que le clavier, fermez le clavier.
Dans viewDidLoad, inscrivez-vous pour recevoir des notifications au clavier et créez un UITapGestureRecognizer:
Ajoutez le clavier afficher / masquer les répondeurs. Là, vous ajoutez et supprimez le TapGestureRecognizer à l'UIView qui devrait fermer le clavier lorsque vous appuyez dessus. Remarque: il n'est pas nécessaire de l'ajouter à toutes les sous-vues ou commandes.
Le TapGestureRecognizer appellera votre fonction quand il obtiendra un tap et vous pouvez fermer le clavier comme ceci:
La bonne chose à propos de cette solution est qu'elle ne filtre que pour les taps, pas les swipes. Donc, si vous avez du contenu défilant au-dessus du clavier, les balayages défileront toujours et laisseront le clavier affiché. En supprimant la reconnaissance des gestes après la disparition du clavier, les futurs appuis sur votre vue seront traités normalement.
la source
C'est une solution pour faire disparaître le clavier lorsqu'il est touché
return
dans n'importe quel champ de texte, en ajoutant du code à un seul endroit (donc ne pas avoir à ajouter un gestionnaire pour chaque champ de texte):considérez ce scénario:
j'ai un
viewcontroller
avec deux champs de texte (nom d'utilisateur et mot de passe). et le protocoleviewcontroller
implémenteUITextFieldDelegate
je fais cela dans viewDidLoad
et le viewcontroller implémente la méthode facultative comme
et quel que soit le champ de texte dans lequel vous vous trouvez, dès que j'appuie
return
sur le clavier, il est rejeté!Dans votre cas, la même chose fonctionnerait tant que vous définissez tous les délégués du champ de texte sur self et implémentez
textFieldShouldReturn
la source
Une meilleure approche consiste à avoir quelque chose de «voler» le statut de premier répondant.
UIApplication étant une sous-classe de UIResponder, vous pouvez essayer:
A défaut, créez un nouveau UITextField avec un cadre de taille nulle, ajoutez-le à une vue quelque part et faites quelque chose de similaire (suivi de la démission).
la source
Rentrez cela dans une classe utilitaire.
la source
@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:
Absolument brillant!
Je vous remercie.
Compte tenu de vos conseils et des conseils des autres dans ce fil, voici ce que j'ai fait:
À quoi il ressemble lorsqu'il est utilisé:
[[self appDelegate] dismissKeyboard];
(Remarque: j'ai ajouté appDelegate en complément de NSObject pour pouvoir l'utiliser n'importe où sur n'importe quoi)À quoi ça ressemble sous le capot:
ÉDITER
Amendement à ma réponse inclus
tempTextField.enabled = NO;
. La désactivation du champ de texte empêcheraUIKeyboardWillShowNotification
et lesUIKeyboardWillHideNotification
notifications de clavier d'être envoyé si vous fier à ces notifications tout au long de votre application.la source
Astuce rapide sur la façon de fermer le clavier dans iOS lorsqu'un utilisateur touche n'importe où sur l'écran en dehors de l'UITextField ou du clavier. Compte tenu de la superficie que le clavier iOS peut occuper, il est logique d'avoir un moyen simple et intuitif pour vos utilisateurs de fermer le clavier.
Voici un lien
la source
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:
la source
Encore plus simple que la réponse de Meagar
écraser
touchesBegan:withEvent:
Cela se produit
dismiss the keyboard
lorsque vous touchez n'importe où dans lebackground
.la source
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:
Ajoutez également cette fonction dans le fichier .m:
la source
Dans le fichier d'en-tête de votre contrôleur de vue, ajoutez
<UITextFieldDelegate>
à la définition de l'interface de votre contrôleur afin qu'elle soit conforme au protocole délégué UITextField ...... Dans le fichier d'implémentation du contrôleur (.m), ajoutez la méthode suivante ou le code qu'il contient si vous avez déjà une méthode viewDidLoad ...
... Ensuite, liez votreTextBox à votre champ de texte réel
la source
Vous devez envoyer
endEditing:
à la fenêtre de travail étant la sous-classe deUIView
la source
La meilleure façon de supprimer le clavier de UITableView et UIScrollView est:
la source
Dans swift 3, vous pouvez effectuer les opérations suivantes
la source
La réponse de Jeremy ne fonctionnait pas tout à fait pour moi, je pense parce que j'avais une pile de navigation dans une vue d'onglet avec une boîte de dialogue modale dessus. J'utilise les éléments suivants en ce moment et cela fonctionne pour moi, mais votre kilométrage peut varier.
la source
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.
la source
Sous-classe vos champs de texte ... et aussi les vues de texte
Dans la sous-classe, mettez ce code ..
Dans les délégués textfield (de même pour les délégués textview)
Tout est prêt. Maintenant, postez la notification de n'importe où dans votre code. Il démissionnera de n'importe quel clavier.
la source
Et rapidement nous pouvons faire
la source
Pour ignorer un clavier après son apparition, il y a 2 cas ,
lorsque l'UITextField est à l' intérieur d'un UIScrollView
lorsque l'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 ajouter un délégué pour tous les UITextView
pour créer une IBAction, appuyez sur ctrl + cliquez sur UITapGesture et faites-le glisser vers le fichier .h de viewcontroller.
Ici, j'ai nommé tappedEvent comme nom d'action
les informations fournies ont été dérivées du lien suivant, veuillez vous référer pour plus d'informations ou me contacter si vous ne comprenez pas les données ci-dessus.
http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/
la source
Je déteste qu'il n'y ait aucun moyen "global" de rejeter le clavier par programmation sans utiliser d'appels d'API privés. Souvent, j'ai besoin de fermer le clavier par programmation sans savoir quel objet est le premier répondant. J'ai eu recours à l'inspection de l'
self
utilisation de l'API d'exécution Objective-C, à l'énumération de toutes ses propriétés, à l'extraction de celles qui sont de typeUITextField
et à l'envoi duresignFirstResponder
message.Ça ne devrait pas être si difficile de faire ça ...
la source
Ce n'est pas joli, mais la façon dont je démissionne du premier répondeur quand je ne sais pas ce qu'est le répondeur:
Créez un UITextField, soit dans IB, soit par programme. Rendez-le caché. Associez-le à votre code si vous l'avez fait dans IB. Ensuite, lorsque vous souhaitez fermer le clavier, vous basculez le répondeur vers le champ de texte invisible et vous le résignez immédiatement:
la source
Vous pouvez parcourir récursivement les sous-vues, stocker un tableau de tous les UITextFields, puis les parcourir et les démissionner tous.
Pas vraiment une excellente solution, surtout si vous avez beaucoup de sous-vues, mais pour les applications simples, cela devrait faire l'affaire.
J'ai résolu cela 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'assignais à une statique qui obtiendrait balayé (résigné) sur la base de certains autres événements ... il 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 à cela pour mon application après avoir trouvé cette question.
la source
Une méthode légèrement plus robuste que j'avais besoin d'utiliser récemment:
J'ai trouvé que certaines des autres méthodes "globales" ne fonctionnaient pas (par exemple,
UIWebView
et ontWKWebView
refusé de démissionner).la source
Ajoutez A Tap Gesture Recognizer à votre vue et définissez-la
votre fichier .m sera comme
Ça a marché pour moi
la source
Oui, endEditing est la meilleure option. Et à partir d'iOW 7.0,
UIScrollView
dispose d'une fonctionnalité intéressante pour ignorer le clavier lors de l'interaction avec la vue de défilement. Pour cela, vous pouvez définir lakeyboardDismissMode
propriété deUIScrollView
.Définissez le mode de fermeture du clavier comme suit:
Il a peu d'autres types. Jetez un œil à ce document Apple .
la source
En bref:
la source
la manière la plus simple est d'appeler la méthode
la source
Vous devez utiliser l'une de ces méthodes,
ou
la source