web-dev-qa-db-fra.com

UITableView didSelectRowAtIndexPath: ne pas être appelé au premier toucher

J'ai un problème avec UITableView'sdidSelectRowAtIndexPath.

Ma table est configurée de sorte que lorsque je sélectionne la ligne, il initialise un nouveau contrôleur de vue et le pousse.

La première fois que je tape sur une ligne de la table, la méthode n'est pas appelée. Une fois que je sélectionne une autre ligne, cela commence à fonctionner normalement.

J'ai vérifié cela en définissant un point d'arrêt sur didSelectRowAtIndexPath. Lors de l'ajout d'un NSLog à la méthode, je constate que lorsque je sélectionne la deuxième ligne qui insère enfin le nouveau contrôleur de vue, deux instructions de journalisation apparaissent simultanément dans la console.

Aucune suggestion?

349
Mark Adams

Toute chance que vous avez tapé accidentellement faitDeselectRowAtIndexPath?

1338
Ole Begemann

Vérifiez également la propriété selection de votre vue sous forme de fichier xib. Utilisez "Sélection unique" ou "Sélection multiple" selon les besoins.

24
includeMe

J'ai rencontré le problème suivant:

  • premier tap dans la rangée -> aucun effet, aucune sélection, jamais
  • deuxième tap et suivi -> comportement de sélection correct, toujours

Dans mon cas, mon erreur vérifiait Show Selection on Touch dans Interface Builder. Vous pouvez le décocher dans IB ici:

enter image description here

J'espère que ça aide quelqu'un

17
sonxurxo

Cochez Si vous avez défini des identificateurs de geste dans votre classe. Enlever le geste a fonctionné pour moi.

11
YSR fan

J'ai même débattu de la publication de cette réponse parce que je pense que les étoiles se sont un peu alignées pour que cela se manifeste.

J'ai une variante de ce problème et j'ai vérifié les autres solutions. Dans la vue Table, il ne traite pas la toute dernière ligne de ma table lors du premier tap. Cela le met en évidence, mais didSelectRowAtIndexPath n'est pas appelé. Toutes les autres lignes fonctionnent bien. Mais si j'active le rebond de tableview, le problème semble alors résolu (mais il faut alors gérer un rebond de tableview).

6
Chase Roberts

UITableViewCellSelectionStyleNone a été défini pour la cellule présentant ce problème (ios9).

J'ai fini par appeler

[tableView deselectRowAtIndexPath:indexPath animated:NO];

première chose à

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

ce qui n'est pas la même chose, mais est suffisant. me fait me demander quel genre de bris de table apporte ios10.

4
Anton Tropashko

ce problème se produit également lorsque vous utilisez la reconnaissance de geste dans une tableView. Dans ce cas, vous n'avez pas besoin de les supprimer, vous devez simplement vous assurer que votre propriété de geste cancelsTouchesInView = false il s'agit d'une valeur booléenne qui détermine si les touches sont livrées à une vue lorsqu'un geste est reconnu.

1
Ayoub Nouri

Swift 2

Assurez-vous que ceci est défini sur true:

self.tableView.allowsSelection = true

Placez ceci au dessus de votre droite après votre viewDidLoad() et avant le super.viewDidLoad()

1
Lukesivi

Si vous avez défini un UITapGestureRecognizer dans votre classe, vous pouvez ajouter cette ligne dans votre didSelectRowAtIndexPath:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

Cela a fonctionné pour moi.

1
garridozh

Swift

Si vous travaillez avec Swift 3 dans une classe qui n'est pas un UITableViewController et que vous utilisez UITableViewDelegate, vous devrez peut-être utiliser le titre de la méthode. :

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}

Cela a fonctionné pour moi, même si je viens de migrer mon projet vers Swift 3.). Il est relativement nouveau et peut donc être corrigé ultérieurement.

1
Adam Smith

Ce qui a fonctionné pour moi a été de commencer à taper "didSelect ..." puis de laisser la correction automatique remplir le reste. Apparemment, certains détails de ma syntaxe étaient confus. Comme d'autres l'ont dit, utilisez l'IDE!

0
safari yellow

Swift

Aucune des autres réponses n'a fonctionné dans mon cas, ce qui l'a résolu pour moi était:

tableView.delaysContentTouches = false

0
Diogo Martins

Swift 4.2

Désactiver "Retarder la retombée" dans l'inspecteur d'attributs a résolu le problème.
Après cela, les clics sont lisses et didSelectRowAt se déclenche immédiatement.

XCode attributes inspector

0
Aviv Mor

Dans mon cas, j'avais un en-tête de section UITableView avec un identificateur de geste. Lorsque l’en-tête est tapé, il convient d’insérer quelques lignes dans cette section et d’animer l’insertion (comme une section de développement/réduction). La première fois qu'elle a été développée et exploitée, la méthode déléguée didSelectRow n'a pas été déclenchée. Pour les actions supplémentaires et les actions Développer/Réduire, cela fonctionnait comme prévu.

Par réponse de @ Ayoub Nouri , je règle cancelsTouchesInView sur false, ce qui a résolu le problème. tapGestureRecognizer? .cancelsTouchesInView = false

0
Kabeer

La fonction didSelectRowAt n'a pas été appelée dans mon application en premier ou en second tap ... J'essayais de résoudre le problème, je ne pouvais pas trouver de solution. Mais tout à coup, je me suis rendu compte que j'utilisais le changement de couleur de view.animation ... La méthode Delegate n'a pas été appelée alors que l'animation persistait

0
Beyaz