J'écris une application iOS avec une vue tabulaire dans une vue à onglets. Dans mon UITableViewController
, j'ai implémenté -tableView:didSelectRowAtIndexPath:
, mais lorsque je sélectionne une ligne au moment de l'exécution, la méthode n'est pas appelée. La vue de table est cependant remplie, donc je sais que d'autres méthodes tableView de mon contrôleur sont appelées.
Quelqu'un a-t-il une idée de ce que j'ai pu foirer pour que cela se produise?
ios
uitableview
cocoa-touch
didselectrowatindexpath
Matt Pfefferle
la source
la source
UITableView
?-didSelectRowAtIndexPath
. J'ai compris le chapeau parce que j'ai un identificateur de geste de robinet sur la table et le geste doit d'abord échouer avant de recevoir le toucher. Bien que cela soit étrange, l'animation de sélection de table n'est pas affectée par le reconnaisseur de gestes.Réponses:
Il semble que la classe ne soit peut-être pas
UITableViewDelegate
pour cette vue de table, bien queUITableViewController
soit censée la définir automatiquement.Y a-t-il une chance que vous réinitialisiez le délégué dans une autre classe?
la source
Juste au cas où quelqu'un aurait fait la même erreur stupide que moi:
Vérifiez si le nom de la méthode de ce que vous attendez
didSelect
peut être obtenu accidentellement d'didDeselect
une manière ou d'une autre. Il m'a fallu environ deux heures pour le découvrir ...la source
Une autre chose qui pourrait conduire au problème n'est pas le type de sélection sélectionné:
Devrait être
Single Selection
pour une sélection normale, ne devrait pas êtreNo Selection
.Pour ce faire par programme, procédez comme suit:
la source
Une autre possibilité est qu'un UITapGestureRecognizer puisse manger les événements, comme c'était le cas ici: https://stackoverflow.com/a/9248827/214070
Je ne soupçonnais pas cette cause, car les cellules du tableau étaient toujours surlignées en bleu comme si les robinets passaient.
la source
didSelectRowAtIndexPath
cela ne fonctionne pas seulement après la suppression de la cellulecommitEditingStyle
. Ensuite, je faisUITapGestureRecognizer
ettapAction:
suis arrivéindexPath
desender.view
([self.tableView indexPathForCell:sender.view]
) et appelle[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Toutes les bonnes réponses, mais il y en a une de plus à rechercher ...
(En particulier lors de la création d'un UITableView par programme)
Assurez-vous que tableView peut répondre à la sélection en définissant
[tableView setAllowsSelection:YES];
ou en supprimant toute ligne qui le définitNO
.la source
setAllowsSelectionDuringEditing:
à la liste (lorsque tableview est en mode édition)Single Selection
.Si le problème survient,
UITapGestureRecognizer
vous pouvez résoudre ce problème:en code avec
Objective-C
:en code avec
Swift
:la source
J'ai rencontré deux choses dans ces situations.
Vous avez peut-être oublié d'implémenter le protocole UITableViewDelegate, ou il n'y a pas de sortie de délégation entre votre classe et votre vue de table.
Vous pouvez avoir une UIView dans votre ligne qui est un premier répondant et supprime vos clics. Dites un bouton UIB ou quelque chose de similaire.
la source
J'ai eu le même problème. Et c'était difficile à trouver. Mais quelque part dans mon code était le suivant:
Ça doit être
return indexPath
, sinon-tableView:didSelectRowAtIndexPath:
on n'appelle pas.la source
Si vous avez ajouté un gestureRecognizer au-dessus de UITableView,
didSelectRowAtIndexPath
il ne sera pas appelé.Vous devez donc utiliser la méthode déléguée gestureRecognizer pour éviter de toucher dans une vue particulière.
la source
if ([touch.view isDescendantOfView:YourTable])
J'ai rencontré un problème où, après des mois de non-consultation de mon code, j'ai oublié que j'avais implémenté la méthode suivante en raison de certaines exigences qui n'étaient pas nécessaires
Il doit retourner OUI pour une ligne afin de la sélectionner.
la source
VOUS DEVEZ sélectionner ces options
mais si vous ne souhaitez
UITableView
pas mettre en surbrillance en cliquant, vous devez modifier lesUITableViewCell
propriétés.Choisissez l'option Aucune pour la sélection comme ci-dessous
la source
J'avais mis une vue
UITapGestureRecognizer
sur ma table pour fermer le clavier qui empêchaitdidSelectRowAtIndexPath:
d'être appelé. J'espère que cela aide quelqu'un.la source
Au cas où vous auriez le même problème que moi: Apparemment, cette méthode ne sera pas appelée si votre tableView est en mode édition. Vous devez définir allowSelectionDuringEditing sur true.
Via cette question: Lors de l'édition, `UITableView` n'appelle pas didSelectRowAtIndexPath ??
la source
J'ai eu le même problème,
La raison était l'utilisation de
UITapGestureRecognizer
. Je voulais que le clavier disparaisse lorsque je tapotais ailleurs. J'ai réalisé que cela annule toutes les actions de prise, c'est pourquoi, ladidSelectRowAtIndexPath
fonction n'a pas été appelée.Lorsque je commente les lignes liées à
UITapGestureRecognizer
, cela fonctionne. De plus, vous pouvez vérifier dans la fonctionUITapGestureRecognizer selector
si le taraudé estUITableViewCell
ou non.la source
Dans mon cas, didSelctRowAtIndexPath n'appelant pas est dû au fait que je n'en ai sélectionné aucun dans la propriété Selection de tableView, réglé sur une seule sélection résolu mon problème
la source
Pour Xcode 6.4, Swift 1.2. La "balise" de sélection a été modifiée dans IB. Je ne sais ni comment ni pourquoi. Le paramétrer sur "Sélection unique" a rendu mes cellules de vue tabulaire sélectionnables à nouveau.
la source
Même si une autre réponse a été acceptée, j'ajouterai un autre problème possible et une solution pour les personnes qui observent ce problème:
Si le comptage automatique des références (ARC) est activé, vous pouvez constater que même après avoir assigné votre contrôleur en tant que délégué de la vue, les messages de la vue au contrôleur ne sont pas reçus car ARC supprime le contrôleur. Apparemment, le pointeur délégué de UITableView ne compte pas comme référence pour l'ARC, donc si c'est la seule référence à celui-ci, le contrôleur sera désalloué. Vous pouvez vérifier si cela se produit ou non en implémentant la méthode dealloc sur le contrôleur et en y définissant un point d'arrêt ou un appel NSLog.
La solution est de garder une trace du contrôleur avec une référence forte ailleurs, jusqu'à ce que vous soyez sûr que vous n'en aurez plus besoin.
la source
N'oubliez pas de définir la source de données et le délégué dans la méthode viewDidLoad comme suit:
la source
Mon problème n'était rien de ce qui précède. Et tellement boiteux. Mais je pensais que je le listerais ici au cas où cela aiderait quelqu'un.
J'en ai un
tableViewController
qui est mon contrôleur "de base" puis je crée des sous-classes de ce contrôleur. J'écrivais tout mon code dans latableView:didSelectRowAtIndexPath
routine de la classe "base". Oubliant complètement que par défaut cette routine avait également été créée (mais sans code qui faisait quoi que ce soit) dans toutes mes sous-classes également. Ainsi, lorsque j'ai exécuté mon application, elle a exécuté la version de sous-classe du code, n'a rien fait et m'a rendu triste. Alors bien sûr, une fois que j'ai supprimé la routine des sous-classes, elle a utilisé la routine de classe "base" de mt et je suis en affaires.Je connais. Ne riez pas. Mais peut-être que cela sauvera quelqu'un l'heure que j'ai perdue ...
la source
Donner mes 2 cents à ce sujet.
J'avais un UITableViewCell personnalisé et il y avait un bouton couvrant toute la cellule, donc quand le toucher s'est produit, le bouton a été sélectionné et non la cellule.
Soit supprimer le bouton ou dans mon cas, j'ai défini l'option Interaction utilisateur sur false sur le bouton, de cette façon la cellule était celle sélectionnée.
la source
Si vous lisez ceci, cela ne résout toujours pas le problème.
J'ai une cellule personnalisée , où la case " Interaction utilisateur activée " était désactivée. Donc, je viens de l'allumer. Bonne chance.
la source
Je viens de l'avoir et comme cela m'est arrivé dans le passé, cela n'a pas fonctionné car je n'ai pas prêté attention à la saisie semi-automatique lorsque j'essaie d'ajouter la méthode et je finis par implémenter
tableView:didDeselectRowAtIndexPath
: au lieu detableView:didSelectRowAtIndexPath:
.la source
Assurez-vous que vous avez mis en œuvre
tableView:didSelectRowAtIndexPath
et nontableView:didDeSelectRowAtIndexPath
Cela m'est arrivé à plusieurs reprises !!
la source
Je sais qu'il est ancien et que le problème a été résolu, mais qu'il y avait un problème similaire, je pensais que le problème était avec mon UITableViewCell personnalisé, mais la solution était complètement différente - je redémarre XCode :) et puis ça marche! presque comme Windows :)
la source
Si votre vue tableau est en mode édition (par exemple
[tableView setEditing:YES animated:NO];
), vous devez définirtableView.allowsSelectionDuringEditing = YES;
la source
Une autre erreur que vous auriez pu faire (comme je l'ai fait): si vous définissez un enchaînement à la cellule,
didSelectRowAtIndexPath
n'est pas appelé. Vous devez plutôt définir vos séquences sur le contrôleur de vue.la source
Aucune de ces réponses n'a fonctionné pour moi. Après environ une heure, j'ai compris quelque chose de très insidieux:
J'ai une vue de table à l'intérieur d'une cellule d'une autre vue de table. J'ai décidé de créer une vue englobante contenant, entre autres, la vue de la table interne. J'ai appelé cette vue contentView et l'ai branchée dans le xib.
Il s'avère que UITableViewCell a déjà une contentView et fait des choses bizarres avec. Le problème s'est résolu lorsque j'ai renommé la propriété en mainContentView et reconnecté la vue à cette propriété renommée.
la source
Dans mon cas, je calcule dynamiquement la hauteur du
TableView
sSuperView
au moment du chargement. En raison d'une erreur de calcul, le aTableView
été positionné à l'extérieur duSuperView
. Le aTableView
été très bien dessiné, mais toutes les interactions ont été désactivées (etdidSelectRowAtIndexPath
n'ont jamais été appelées). Très difficile à détecter, car rien n'indique visuellement qu'ilTableView
n'est pas "accessible".la source
Dans mon cas, le problème était que j'avais une
UITableViewCell
sous-classe et j'avais implémenté ces deux méthodes:touchesBegan:withEvent:
&touchesEnded:withEvent
pour gérer une animation fantaisie au toucher. Mais j'avais oublié d'ajouter la[super touchesBegan:touches withEvent:event];
méthode ad[super touchesEnded:touches withEvent:event];
pour informer également le parent de la cellule du toucher.Changer le code en suivant a résolu mon problème:
la source
Dans mon cas, la solution consistait à remplacer NON par OUI dans la fonction ci-dessous.
iOS 9+
la source