UITableView didSelectRowAtIndexPath: non appelé au premier tapotement

352

J'ai un problème avec UITableView's didSelectRowAtIndexPath.

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

La première fois que j'appuie sur une ligne du tableau, la méthode n'est pas appelée. Une fois que j'ai sélectionné une autre ligne, elle commence à fonctionner normalement.

J'ai vérifié cela en définissant un point d'arrêt didSelectRowAtIndexPath. Lors de l'ajout d'un NSLogà la méthode, je vois que lorsque je sélectionne la deuxième ligne qui pousse finalement le nouveau contrôleur de vue, je vois deux instructions de journal apparaître dans la console en même temps.

Aucune suggestion?

Mark Adams
la source
2
Pouvez-vous publier votre code pour tableView:didSelectRowAtIndexPath:?
gerry3
J'ai eu le même problème, vérifiez ma réponse: stackoverflow.com/a/44097559/1600061
Zsivics Sanel
1
L'envoi dans la file d'attente principale a résolu mon problème stackoverflow.com/questions/20149167/…
durgeshtrivedi

Réponses:

1356

Y a-t- il une chance que vous ayez accidentellement tapé De selectRowAtIndexPath?

Ole Begemann
la source
17
@Dschee ce n'est pas appelé au premier tapotement car vous ne désélectionnez rien. Une fois que vous avez sélectionné une ligne, lorsque vous essayez d'en sélectionner une seconde, la première est désélectionnée.
Le mec du
19
Voilà pourquoi je l'aime tellement.
elbuild
4
J'ai voté pour cela non pas parce que j'ai fait cette erreur une fois. J'ai voté parce que j'ai fait cette erreur pas moins de 4 fois en autant d'années, ce qui coûte tellement de temps.
Brooks Hanes du
8
OMG!! C'est peut-être le pire bug que j'ai introduit dans mon code.
Shantanu Paul
4
SENSATIONNEL. Cela m'a fait gagner beaucoup de temps.
MortalMan
24

Vérifiez également la propriété de sélection de votre vue de table dans le fichier xib. Utilisez «Sélection unique» ou «Sélection multiple» selon les besoins.

includeMe
la source
2
Ba ha ha ha! Wow, j'ai passé 4 heures à essayer de comprendre cela. @includeMe à la rescousse (salut)! Merci!
17

J'ai rencontré le problème suivant:

  • première pression d'affilée -> pas d'effet, pas de sélection, jamais
  • deuxième appui et suivi -> comportement de sélection correct, toujours

Dans mon cas, mon erreur consistait à vérifier Show Selection on TouchInterface Builder. Vous pouvez le décocher dans IB ici:

entrez la description de l'image ici

J'espère que cela aide quelqu'un

sonxurxo
la source
Tu es mon héros! Une idée pourquoi c'est la valeur par défaut? Je ne peux penser à aucune application ayant ce comportement et je pense que c'est un défaut très étrange.
Christophe Fondacci
12

Cochez Si vous avez défini des modules de reconnaissance de gestes dans votre classe. Supprimer le geste a fonctionné pour moi.

Ventilateur YSR
la source
J'ai les deux; Reconnaissance de gestes et didSelectRowAtIndexPath? Cependant, la reconnaissance des gestes a toujours la préférence. Impossible d'accéder au deuxième. Existe-t-il un moyen de gérer les deux ou dois-je me débarrasser de la reconnaissance des gestes? Merci!
Ron
cela doit être au top :) cela m'a coûté 1 heure après 7 ans de développement iOS.
Clown
6

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

J'ai une variation de ce problème et j'ai vérifié les autres solutions. Sur ma vue de table, il ne traite pas la toute dernière ligne de ma table au premier tapotement. Il le met en évidence, mais didSelectRowAtIndexPathn'est pas appelé. Toutes les autres rangées fonctionnent bien. Mais si j'active le rebond de la table, cela semble résoudre le problème (mais alors vous devez faire face à un rebond de la table).

Chase Roberts
la source
Avez-vous trouvé la raison pour laquelle cela se produit? J'ai exactement le même problème. Lorsque je désactive le rebond de la table, la première / dernière ligne du tableau ne réagit pas au premier tapotement. Je pensais que c'était un bug mais ça fait plus d'un an et ça continue.
filip.karas
Non. Je viens d'activer le rebond de la table et de le laisser là.
Chase Roberts
J'ai ce problème sur un iPhone 5 uniquement (iOS 10.3) - l'activation du rebond sur ma table a résolu le problème. Très étrange!
Lee Probert
4

UITableViewCellSelectionStyleNone a été défini pour la cellule affichant 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 pareil, mais c'est assez bon. me fait me demander quel genre de rupture de table ios10 apporte.

Anton Tropashko
la source
Cela a fonctionné pour moi mais j'ai besoin d'une solution de contournement pour masquer la sélection sans faire son style Aucun. J'ai annulé, setSelectedmais pendant que l'utilisateur tient la cellule, la sélection apparaît, ce qui n'est pas acceptable
MMujtabaRoohani
1

SWIFT 2

Assurez-vous que ce paramètre est défini sur true:

self.tableView.allowsSelection = true

Mettre cela au- dessus de votre droite après votre viewDidLoad()et avant lasuper.viewDidLoad()

Lukesivi
la source
1

SWIFT 3

Si vous travaillez avec Swift 3 dans une classe qui n'est pas un UITableViewControlleret 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. C'est assez nouveau, donc cela peut être corrigé plus tard.

Adam Smith
la source
1

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.

Garridozh
la source
1

ce problème se produit également lorsque vous travaillez avec l'outil de reconnaissance des gestes dans une table. Dans ce cas, vous n'avez pas besoin de les supprimer, il vous suffit de vous assurer que votre propriété de geste cancelsTouchesInView = falseest une valeur booléenne affectant si des touches sont fournies à une vue lorsque un geste est reconnu.

Ayoub Nouri
la source
0

SWIFT 3

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

tableView.delaysContentTouches = false

Diogo Martins
la source
0

didSelectRowAtLa fonction n'a pas été appelée dans mon application au premier ou au deuxième appui ... J'essayais de résoudre le problème, je n'ai trouvé aucune solution. Mais soudain, j'ai été reconnu, j'utilisais view.animation changement de couleur ... la Delegateméthode n'a pas été appelée pendant que l'animation persiste

Beyaz
la source
0

Dans mon cas, j'avais un en-tête de section UITableView avec un reconnaisseur de gestes. Lorsque l'en-tête est tapé, il doit insérer quelques lignes dans cette section et animer l'insertion (comme développer / réduire la section). La première fois lorsqu'elle a été développée et appuyée, la méthode déléguée didSelectRow n'a pas été déclenchée. Pour d'autres taps et actions de développement / réduction, cela fonctionnait comme prévu.

Selon la réponse de @Ayoub Nouri, j'ai défini cancelsTouchesInView sur false, ce qui a résolu le problème. tapGestureRecognizer? .cancelsTouchesInView = false

Kabeer
la source
0

Swift 4.2

La désactivation de "Delay Touch Down" dans l'inspecteur d'attributs a résolu le problème.
Après cela, les clics sont fluides et didSelectRowAt se déclenche immédiatement.

Inspecteur d'attributs XCode

Aviv Mor
la source
0

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

jaune safari
la source