J'ai un UITableView
avec des UITextField
cellules. Je voudrais supprimer le clavier lorsque l'arrière-plan du UITableView
est touché. J'essaye de faire ceci en créant une UIButton
taille de la UITableView
et en la plaçant derrière le UITableView
. Le seul problème est qu'il UIButton
capte toutes les touches même lorsque le toucher est sur UITableView. Qu'est-ce que je fais mal?
Merci!
ios
uitableview
uikeyboard
Hua-Ying
la source
la source
Réponses:
Cela se fait facilement en créant un objet UITapGestureRecognizer (par défaut, cela détectera un «geste» en un seul clic, donc aucune personnalisation supplémentaire n'est requise), en spécifiant une cible / action pour le moment où le geste est déclenché, puis en attachant l'objet de reconnaissance de mouvement à votre vue de table.
Par exemple, peut-être dans votre
viewDidLoad
méthode:Et la
hideKeyboard
méthode pourrait ressembler à ceci:Notez que le geste n'est pas déclenché lorsque vous touchez l'intérieur d'un
UITextField
objet. Il est déclenché enUITableView
arrière - plan, en pied de page, en en-tête et à l'UILabels
intérieur des cellules, etc.la source
gestureRecognizer.cancelsTouchesInView = NO;
hideKeyboard
méthode, au lieu de communiquer directement avec les champs de texte, vous pouvez le faire[self.view endEditing:NO];
. Extrait de la documentation Apple: " Cette méthode examine la vue actuelle et sa hiérarchie de sous-vues pour le champ de texte qui est actuellement le premier répondeur. S'il en trouve un, il demande à ce champ de texte de démissionner en tant que premier répondant. Si le paramètre de force est défini sur OUI, le champ de texte n'est même jamais demandé; il est obligé de démissionner. "La solution UITapGestureRecognizer fonctionne avec la sélection de cellule de tableau si vous définissez:
la source
shouldReceiveTouch
Voici une meilleure façon de procéder. Fais juste ça
ou
la source
Vous pouvez également le faire à partir de Storyboard:
la source
Comme
UITableView
c'est une sous-classe deUIScrollView
, l'implémentation d'une méthode de délégué ci-dessous fournit une solution extrêmement simple et rapide. Pas besoin même d'impliquerresignFirstResponder
puisque la hiérarchie de vue introspecte et trouve le répondeur actuel et lui demande de démissionner de son statut de répondeur.Et n'oubliez pas d'ajouter
UIScrollViewDelegate
au fichier d'en-tête.la source
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
Tout d'abord, écoutez
scrollViewWillBeginDragging
dans votreUIViewController
en ajoutantUIScrollViewDelegate
:Dans le fichier .h:
Dans le fichier .m:
Ensuite, écoutez les autres interactions:
Puis implémentez
dismissKeyboard
:Et si, comme moi, vous vouliez supprimer le clavier d'un UITextField dans une cellule de tableau personnalisée:
J'espère que cela aide quiconque cherche !!
la source
la source
Voici la version rapide pour votre plaisir de codage:
Il ajoute un outil de reconnaissance des gestes, puis ferme le clavier. Aucune prise pour le TextField n'est requise!
la source
Il existe une version Swift 3 sans bloquer les robinets sur les cellules.
En
viewDidLoad()
méthode:Et
hideKeyboard
ressemble à ceci:la source
Je l'ai fait comme ça:
Créez une méthode dans votre TableViewController pour désactiver le premier répondeur (qui serait votre TextBox à ce stade)
En
tableView:didSelectRowAtIndexPath:
appeler la méthode précédente:la source
didSelectRowAtIndexPath
ne se déclenche pas si vous appuyez sur le TableView lui-même.J'avais un
UITableViewController
et la mise en œuvretouchesBegan:withEvent:
n'a pas fonctionné pour moi.Voici ce qui a fonctionné:
Rapide:
Objectif c:
la source
Ensuite, assurez-vous que dans votre fichier Nib vous définissez le type de votre UITableView sur DismissableUITableView ..... peut-être que j'aurais pu penser à un meilleur nom pour cette classe, mais vous comprenez.
la source
Si vous ciblez iOS7, vous pouvez utiliser l'un des éléments suivants:
Le premier animera le clavier hors de l'écran lorsque la vue de la table défilera et le dernier masquera le clavier comme l'application de messages en stock.
Notez que ceux-ci sont de
UIScrollView
, quiUITableView
hérite de.la source
Essaye ça:
la source
UITableView est une sous-classe de UIScrollView.
La façon dont je l'ai fait était d'écouter un événement de défilement par l'utilisateur, puis de resignFirstResponder. Voici la méthode UIScrollViewDelegate à implémenter dans votre code;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
En abordant ces types de problèmes, j'ai trouvé que le meilleur moyen est de rechercher les protocoles délégués pour chaque objet et ceux des classes parentes (dans ce cas, UITableViewDelegate, UIScrollViewDelegate. Le nombre d'événements déclenchés par les objets NS est assez important et complet. C'est également plus facile de mettre en œuvre un protocole puis de sous-classer quoi que ce soit.
la source
J'ai eu le même problème et voici ma solution, cela fonctionne parfaitement pour moi:
Dans le contrôleur de vue ou de vue que vous avez implémenté
<UITextFieldDelegate>
(Dans mon cas, j'ai une coutume
UITableViewCell
appelée TextFieldCell),Déclarez le
UITapGestureRecognizer
comme propriété:Et initialisez-le dans votre vue / contrôleur:
Dans la
- (void)textFieldDidBeginEditing:(UITextField *)textField
méthode, utilisezsuperView
pour passer à votre tableView et appelezaddGestureRecognizer
:Et dans le
- (void)textFieldDidEndEditing:(UITextField *)textField
, supprimez simplement le module de reconnaissance de mouvement:J'espère que ça aide.
la source
Je voulais que ma cellule ouvre le clavier lorsqu'une partie de la cellule est sélectionnée et la ferme si vous cliquez n'importe où hors de la cellule. Pour ouvrir le clavier:
(REMARQUE: j'ai sous-classé la cellule mais vous pouvez facilement y parvenir dans la
tableView:didSelectRowAtIndexPath:
méthode déléguée deUITableView
)Cela signifiait qu'avec les meilleures solutions, si vous cliquez deux fois sur la cellule, le clavier tremblerait lorsque, d'abord, le module de reconnaissance de gestes tentait de fermer le clavier, puis la cellule était resélectionnée et essayait d'ouvrir le clavier.
La solution consiste à vérifier si le clic s'est produit à l'intérieur de la cellule actuellement sélectionnée:
la source
J'ai trouvé une solution qui fonctionne très bien.
Est nécessaire pour utiliser la UIGestureRecognizerDelegate et la méthode - gestureRecognizer: shouldReceiveTouch: .
Ajoutez le module de reconnaissance de mouvement à TableView comme suit:
Ensuite, implémentez la méthode de délégué shouldReceiveTouch pour rejeter les touches effectuées dans la classe UITableViewCell. La méthode hideKeyboard ne sera appelée que lorsque le toucher aura été effectué en dehors de la classe UITableViewCell.
la source
UITableView
a unebackgroundView
propriété pratique , avec laquelle j'ai obtenu ce comportement sans jouer avec la sélection de cellules, comme indiqué ci-dessous dans Swift:la source
Je cherchais la solution et je n'ai rien trouvé qui convienne à mon code, alors je l'ai fait comme ceci:
http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap
Il s'agit essentiellement d'une combinaison d'approches mentionnées précédemment, mais ne nécessite aucune sous-classe ni de création de boutons d'arrière-plan.
la source
Utiliser simplement un UITapGestureRecognizer et
cancelsTouchesInView = NO
signifie que les tapotements sur les cellules et UITextViews déclenchent également le masquage. C'est mauvais si vous avez plusieurs UITextViews et que vous appuyez sur le suivant. Le clavier commencera à se cacher, puis le textView suivant deviendra le premier répondeur et le clavier redeviendra visible. Pour éviter cela, vérifiez l'emplacement du robinet et ne masquez le clavier que si le robinet n'est pas sur une cellule:Pour
scrollViewWillBeginDragging:
être déclenchée, lascrollEnabled
propriété de tableView doit êtreYES
la source
Pourquoi voulez-vous créer une table pleine de champs de texte? Vous devez utiliser une vue détaillée pour chaque ligne contenant les champs de texte. Lorsque vous poussez votre vue détaillée, assurez-vous d'appeler "[myTextField devenirFirstResponder]" afin que l'utilisateur puisse commencer à modifier en un seul clic à partir de la liste du tableau.
la source
Si vous êtes prêt à sous-classer (ugh!) Votre vue de table, quelque chose comme ça pourrait fonctionner:
la source
Si vous voulez fermer le clavier pendant que vous appuyez sur la touche de retour, vous pouvez simplement ajouter le code suivant dans textField devrait retourner la méthode c'est-à-dire:
Certains champs de texte peuvent avoir une vue de sélection ou une autre comme sous-vue, donc dans ce cas, la méthode ci-dessus ne fonctionne pas, donc dans ce cas, nous devons utiliser la classe UITapGestureRecognizer, c'est-à-dire ajouter l'extrait de code suivant à la méthode viewDidLoad, c'est-à-dire:
Maintenant, ajoutez simplement le répondeur démissionnaire à la méthode de sélection, à savoir:
J'espère que cela aide, merci :)
la source
Beaucoup de réponses intéressantes. Je voudrais compiler différentes approches dans la solution qui, selon moi, correspond le mieux à un scénario UITableView (c'est celui que j'utilise habituellement): ce que nous voulons généralement, c'est masquer le clavier dans deux scénarios: en tapant en dehors des éléments de l'interface utilisateur de texte, ou en faisant défiler l'UITableView vers le bas / vers le haut. Le premier scénario que nous pouvons facilement ajouter via un TapGestureRecognizer, et le second via la méthode UIScrollViewDelegate scrollViewWillBeginDragging :. Premier ordre du jour, la méthode pour masquer le clavier:
Cette méthode démissionne de toute interface utilisateur textField des sous-vues dans la hiérarchie de vues UITableView, c'est donc plus pratique que de résigner chaque élément indépendamment.
Ensuite, nous nous occupons du rejet via un geste Tap extérieur, avec:
La définition de tapGestureRecognizer.cancelsTouchesInView sur NO permet d'éviter que gestureRecognizer ne remplace le fonctionnement interne normal de UITableView (par exemple, ne pas interférer avec la sélection de cellule).
Enfin, pour gérer le masquage du clavier lors du défilement haut / bas de UITableView, nous devons implémenter le protocole UIScrollViewDelegate scrollViewWillBeginDragging: méthode, comme:
fichier .h
fichier .m
J'espère que ça aide! =)
la source
Voici comment j'ai finalement réalisé des œuvres. J'ai combiné des suggestions et des codes de différentes réponses. Fonctionnalités: suppression du clavier, déplacement des champs de texte au-dessus du clavier lors de l'édition et réglage du type de retour du clavier "Suivant" et "Terminé". REMPLACER "..." avec plus de champs
la source
La réponse de @ mixca est très utile mais que faire si j'ai quelque chose de différent de UITextField. Je pense que la meilleure façon de le gérer en recherchant toutes les sous-vues de la vue principale avec la fonction récursive, consultez l'exemple ci-dessous
et vous pouvez également mettre cette méthode dans votre classe d'utilité et utiliser un geste de pression comme la réponse de @ mixca.
la source
Swift 4 / 4,2 / 5
Vous pouvez également fermer le clavier lorsqu'une cellule est tapée - avant de faire quoi que ce soit d'autre.
la source
tableView.keyboardDismissMode = .onDrag // .interactive
la source