304 votes

-didSelectRowAtIndexPath : n'est pas appelé

J'écris une application iOS avec une vue tableau dans une vue onglet. Dans mon UITableViewController j'ai mis en place -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 la table est pourtant remplie, et je sais donc 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 ?

80 votes

Il se peut aussi que vous ayez un gestureRecognizer au-dessus de l'UITableView qui absorbe la sélection (c'est une des possibilités).

0 votes

Attention si la vue de la table se remplit, cela signifie que le DataSource est bien réglé. La sélection fait partie des méthodes du Delegate. Donc peut-être que la DataSource est bien configurée mais pas le Delegate !

1 votes

Bonjour M.Othman, votre commentaire correspond exactement à ce qui n'allait pas dans mon propre problème. Savez-vous comment faire pour que gestureRecognizer fonctionne "avec" l'interface de l'utilisateur ? UITableView ?

535voto

CGee Points 764

Juste au cas où quelqu'un ferait la même erreur stupide que moi :

Vérifiez si le nom de la méthode correspond à ce que vous attendez d'elle. didSelect peut être obtenu accidentellement didDeselect d'une certaine manière. Il m'a fallu environ deux heures pour découvrir ...

47 votes

Même problème ici. C'est parce que XCode autocomplète le Deselect avant le Select.

0 votes

De même, j'avais défini allowsSelection = false, ce qui, en plus de supprimer toute mise en évidence de la sélection, empêche également de presser la cellule !

516voto

deniskurt Points 178

Une autre chose qui peut conduire à ce problème est le fait de ne pas choisir le type de sélection :

UITableView selection kind

Devrait être Single Selection pour la sélection normale, devrait no être No Selection .

Pour faire cela de manière programmatique, faites :

tableView.allowsSelection = YES

4 votes

Je rencontre toujours ce problème parce que j'ai des scènes qui sont toujours en mode édition et j'oublie toujours de changer le défaut de "Pas de sélection pendant l'édition".

3 votes

Vous pouvez ajouter cette ligne dans votre méthode -viewDidLoad de viewControlller NSParameterAssert(self.tableView.allowsSelection) ;

0 votes

Pour ceux qui ont observé que tableView.rx.itemSelected.subscribe n'a pas rappelé, voici le problème et la correction ci-dessus fonctionne.

302voto

bugloaf Points 396

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 n'ai pas soupçonné cette cause, parce que les cellules du tableau continuaient de s'éclairer en bleu comme si les tapotements passaient.

0 votes

C'était mon problème ! Merci beaucoup ! Je veux dire que cela fonctionnait clairement avant, mais cela a cessé de fonctionner après que j'ai implémenté UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)] ; [self.view addGestureRecognizer:tap] ;

28 votes

J'ai eu le même problème que vous @coolcool1994 ; j'ai simplement implémenté [tap setCancelsTouchesInView:NO] ; et j'ai résolu le problème.

0 votes

Merci, cela m'aide. Dans mon cas didSelectRowAtIndexPath ne fonctionne pas seulement après avoir supprimé une cellule dans commitEditingStyle . Ensuite, je fais UITapGestureRecognizer et en tapAction: obtenu indexPath de sender.view ( [self.tableView indexPathForCell:sender.view] ) et appeler [self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]

151voto

Old McStopher Points 2765

Toutes les réponses sont bonnes, mais il y en a une autre à laquelle il faut faire attention...

(en particulier lors de la création programmatique d'un UITableView).

Assurez-vous que le tableView peut répondre à la sélection en définissant les paramètres suivants [tableView setAllowsSelection:YES]; ou en supprimant toute ligne qui lui donne la valeur NO .

11 votes

J'ajouterais setAllowsSelectionDuringEditing: à la liste (lorsque le tableau est en mode édition)

0 votes

Merci ! Dans IB, j'ai dû changer la valeur de la section "Sélection" en Single Selection .

98voto

Hunter Points 2827

On dirait que la classe n'est peut-être pas la UITableViewDelegate pour cette vue de la table, bien que UITableViewController est censé régler cela automatiquement.

Y a-t-il une chance que vous ayez réinitialisé le délégué à une autre classe ?

7 votes

J'ai découvert que, bien que mon contrôleur soit un UITableViewController, j'ai utilisé un bon vieux widget UIViewController dans UI Builder. Cela ne fonctionne pas. Lorsque j'ai supprimé le widget UIViewController et déposé un UITableViewController à sa place, tout a fonctionné.

1 votes

Un autre cas limite pour tout le monde - j'ai câblé le délégué dans le code et j'avais oublié que j'avais auparavant câblé le délégué via le storyboard ..... Le dernier à le mettre en place gagne.

1 votes

Pouvez-vous montrer comment "réinitialiser un délégué à une autre classe" s'il vous plaît ? J'ai le même problème et je n'arrive pas à le résoudre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X