J'ai écrit ma propre fonction pour faire défiler les champs de texte lorsque le clavier apparaît. Afin de fermer le clavier en tapant loin du champ de texte, j'ai créé unUITapGestureRecognizer
qui prend soin de démissionner du premier répondeur sur le champ de texte lors du tapotement.
Maintenant, j'ai également créé une saisie semi-automatique pour le UITableView
champ de texte qui crée juste en dessous du champ de texte et le remplit d'éléments lorsque l'utilisateur entre du texte.
Cependant, lors de la sélection de l'une des entrées dans la table de saisie semi-automatique, didSelectRowAtIndexPath
n'est pas appelé. Au lieu de cela, il semble que le module de reconnaissance des gestes du robinet soit appelé et démissionne simplement du premier répondant.
Je suppose qu'il existe un moyen de dire au reconnaisseur de gestes de toucher de continuer à transmettre le message de toucher au UITableView
, mais je ne peux pas comprendre ce que c'est. Toute aide serait très appréciée.
Réponses:
Ok, enfin trouvé après quelques recherches dans les documents de reconnaissance des gestes.
La solution consistait à implémenter
UIGestureRecognizerDelegate
et à ajouter ce qui suit:Cela s'en est occupé. J'espère que cela aidera également les autres.
la source
return ![touch.view isKindOfClass:[UITableViewCell class]];
![touch.view isEqual: self.tableView] &&
avant le[touch.view isDescendantOfView: self.tableView]
pour exclure letableView
lui - même (carisDescendantOfView:
retourne égalementYES
si l'argument-vue est le récepteur-vue lui-même). J'espère que cela aide d'autres personnes qui veulent le même résultat.La façon la plus simple de résoudre ce problème est de:
Cela permet de
UIGestureRecognizer
reconnaître le robinet et également de passer le toucher au répondeur suivant. Une conséquence inattendue de cette méthode est si vous avez unUITableViewCell
écran qui pousse un autre contrôleur de vue. Si l'utilisateur appuie sur la ligne pour fermer le clavier, le clavier et le push seront reconnus. Je doute que ce soit votre intention, mais cette méthode convient à de nombreuses situations.En outre, en développant la réponse de Robert, si vous avez un pointeur sur la table en question, vous pouvez directement comparer sa classe au lieu de devoir la convertir en chaîne et espérer qu'Apple ne changera pas la nomenclature:
N'oubliez pas que vous devez également déclarer
UIGestureRecognizer
avoir un délégué contenant ce code.la source
isDescendantOfView
au lieu de simplement vérifier si leclass
est égal, car vous pouvez appuyer sur une sous-vue. Dépend de ce dont vous avez besoin.Définissez
cancelsTouchesInView
votre identificateur sur false. Sinon, il "consomme" le toucher pour lui-même et ne le transmet pas à la vue de table. C'est pourquoi l'événement de sélection ne se produit jamais.par exemple dans
swift
la source
Et pour Swift (basé sur la réponse de @Jason):
la source
Je peux avoir une meilleure solution pour ajouter un geste de tapotement sur une vue de table mais en permettant la sélection de cellules en même temps:
Je cherche juste une cellule au point de l'écran où l'utilisateur tape. Si aucun chemin d'index n'est trouvé, je laisse le geste recevoir le toucher sinon je l'annule. Pour moi, cela fonctionne très bien.
la source
Je pense qu'il n'est pas nécessaire d'écrire des blocs de codes simplement définis
cancelsTouchesInView
surfalse
votre objet gestuel, par défaut c'esttrue
et vous n'avez qu'à le définirfalse
. Si vous utilisez unUITapGesture
objet dans votre code et utilisez égalementUIScrollView
(tableview, collectionview), définissez cette propriétéfalse
la source
Une solution similaire consiste à mettre en œuvre
gestureRecognizer:shouldReceiveTouch:
à l'aide de la classe de la vue pour déterminer l'action à entreprendre. Cette approche a l'avantage de ne pas masquer les taps dans la région entourant directement la table (les vues de cette zone descendent toujours des instances UITableView, mais elles ne représentent pas les cellules).Cela a également un bonus qu'il fonctionne avec plusieurs tables sur une seule vue (sans ajouter de code supplémentaire).
Mise en garde: il est supposé qu'Apple ne changera pas le nom de classe.
la source
return ![[touch.view.superview class] isSubclassOfClass:[UITableViewCell class]];
Pour Swift 4.2, la solution consistait à implémenter
UIGestureRecognizerDelegate
et à ajouter ce qui suit:lorsque vous cliquez sur la vue de table, cette méthode déléguée renvoie false et la
didSelectRowAtIndexPath
méthode de vue de table fonctionne correctement.la source
J'ai eu une situation différente où je voulais que la fonction de geste tactile soit appelée uniquement lorsque l'utilisateur tapait à l' extérieur de la vue de table. Si l'utilisateur a tapé à l'intérieur de la vue de table, la fonction de geste tactile ne doit pas être appelée. En outre, si la fonction de geste tactile est appelée, elle doit toujours transmettre l'événement tactile à la vue sur laquelle vous avez tapé plutôt que de le consommer.
Le code résultant est une combinaison de la réponse d'Abdulrahman Masoud et de la réponse de Nikolaj Nielsen.
Et dans la
MyViewController
classe, la classe qui a leUITableView
, dans leonViewDidLoad()
, je me suis assuré d'appeleraddGestureRecognizer()
:la source
Il suffit de définir
cancels touches in view
àfalse
pour tout geste sous le(table/collection)View
:- Interfacebuilder
- Code
la source
Bien qu'il soit tard et que beaucoup de gens trouvent que les suggestions ci-dessus fonctionnent bien, je n'ai pas pu faire fonctionner les méthodes de Jason ou TMilligan.
J'ai une tableView statique avec plusieurs cellules contenant des textFields qui reçoivent des entrées numériques en utilisant uniquement le clavier numérique. C'était idéal pour moi:
Assurez-vous que vous l'avez implémenté
<UIGestureRecognizerDelegate>
dans votre fichier .h.Cette ligne
![touch.view isKindOfClass:[UITableViewCell class]]
vérifie si une tableViewCell a été tapée et rejette tout clavier actif.la source
Une solution simple utilise des instances UIControl dans UITableViewCell pour obtenir des contacts. Vous pouvez ajouter des vues avec userInteractionEnables == NO à UIControl pour obtenir des taps.
la source
Voici ma solution, qui lie directement shouldReceiveTouch du module de reconnaissance à l'affichage du clavier.
Dans votre délégué de reconnaissance des gestes tactiles:
Et le
PFXKeyboardStateListener.h
:Et le
PFXKeyboardStateListener.m
:Vous voudrez peut-être mettre à jour le modèle singleton de l'écouteur de clavier, je n'y suis pas encore arrivé. J'espère que cela fonctionne pour tout le monde ainsi que pour moi. ^^
la source
Implémentez cette méthode pour déléguer UIGestureRecognizer:
la source
En rapide, vous pouvez l'utiliser à l'intérieur
la source
Mon cas était différent, y compris une barre de recherche et uitableview sur self.view. Je voulais ignorer le clavier uisearchbar en touchant la vue.
Sur les méthodes déléguées UISearchBar:
Lorsque l'utilisateur touche à self.view:
la source
Swift 5, mai 2020.
J'ai un textField et une tableView qui deviennent visibles lorsque j'entre du texte.
État initial Je souhaite donc 2 événements différents lorsque j'appuie sur tableViewCell ou autre chose.
Le clavier et la table sont affichés
Nous ajoutons d'abord tapGestureRecognizer.
Ensuite, nous ajoutons la vérification suivante dans UIGestureRecognizerDelegate:
}
Si je veux d'abord masquer le clavier, la tableView reste visible et sensible à mes appuis.
entrez la description de l'image ici
la source
Ceci est ma solution basée sur les réponses ci-dessus ... Cela a fonctionné pour moi ...
la source
PROBLÈME: Dans mon cas, le problème était que j'avais initialement placé un bouton dans chaque cellule collectionView et défini les contraintes pour remplir la cellule, de sorte que lorsque la cellule était cliquée, elle cliquait sur le bouton, mais la fonction des boutons était vide, donc rien n'était semble se produire.
CORRECTIF: j'ai résolu ce problème en supprimant le bouton de la cellule de la vue de la collection.
la source