J'ai un problème avec UITableView's
didSelectRowAtIndexPath
.
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?
Toute chance que vous avez tapé accidentellement faitDeselectRowAtIndexPath?
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.
J'ai rencontré le problème suivant:
Dans mon cas, mon erreur vérifiait Show Selection on Touch
dans Interface Builder. Vous pouvez le décocher dans IB ici:
J'espère que ça aide quelqu'un
Cochez Si vous avez défini des identificateurs de geste dans votre classe. Enlever le geste a fonctionné pour moi.
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).
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.
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.
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()
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.
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.
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!
Swift
Aucune des autres réponses n'a fonctionné dans mon cas, ce qui l'a résolu pour moi était:
tableView.delaysContentTouches = false
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
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