web-dev-qa-db-fra.com

UICollectionView n'appelant que didSelectItemAtIndexPath si l'utilisateur tape deux fois, n'appelle pas lorsque l'utilisateur tape simple

J'ai un UICollectionView qui a à peu près la taille de l'écran. Les UICollectionViewCells qu'il affiche ont la même taille que collectionView. Chaque cellule a un UIImage qui est la taille de la cellule. La pagination est activée sur CollectionView. Il s'agit donc essentiellement d'un diaporama de photos en plein écran que l'utilisateur peut parcourir. 

Le problème est que
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath n’est appelé que si l’utilisateur tape avec une main sur une cellule ou appuie longuement avec un doigt puis relâche. Il ne semble pas avoir le comportement par défaut de la sélection d'une seule touche. Je n'ai apporté aucune modification au programme de reconnaissance de gestes CollectionView, j'ai donc du mal à trouver une solution à ce problème. 

47
Kris Gellci

Êtes-vous sûr de ne pas surcharger accidentellement - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath? "Sélectionner" et "désélectionner" m'ont déjà déclenché avec l'achèvement du code de Xcode.

198
Owen Mathews

J'avais juste le même problème et il s'est avéré qu'il y avait un UITapGestureRecognizer sur le UIView contenant le UICollectionView et qu'il répondait à la place.

Cela explique pourquoi didSelectItemAtIndexPath ne fonctionne que si l'utilisateur tape avec deux doigts ou appuie longuement avec un doigt car cela ne déclenche pas le UITapGestureRecognizer.

Donc, vérifiez tous les UITapGestureRecognizer que vous avez obtenus, pas nécessairement directement sur le UICollectionView, mais cela pourrait être sur tout UIView le contenant.

119
iDifferent

Si vous avez une vue sur la cellule qui obstrue la vue du contenu des cellules qui est intraitable, vous ne pourrez pas vous connecter au rappel de délégué pour la cellule.

Vous voudrez désactiver l'interaction utilisateur sur la vue obstruant, soit dans la carte NIB, soit dans le code.

view.userInteractionEnabled = NO;

13
Oliver Atkinson

Ajoutez simplement à la question déjà résolue une situation supplémentaire dans laquelle le geste de tapoter pourrait ne pas fonctionner, car cela ne cessait de me tourmenter.

Si vous renvoyez false dans UICollectionViewDelegate's collectionView:shouldHighlightItemAtIndexPath:, le geste de toucher ne fonctionnera pas et le collectionView:didSelectItemAtIndexPath: ne sera pas appelé. La valeur de retour par défaut de cette méthode de délégation est true. Vous ne rencontrerez donc pas le problème si vous ne l'implémentez pas délibérément. 

7
Blaszard

Je viens de rencontrer ce problème moi-même. À l’origine, j’avais des boutons et des étiquettes, puis j’ai remanié mon interface utilisateur et transformé ces boutons/étiquettes en cellules pour un UICollectionView.

J'ai finalement réalisé que les boutons consommaient mes taps. Je venais inconsciemment de placer mes boutons d'origine dans la cellule et de ne pas le transformer en une UIImage droite. J'avais détruit les boutons associés aux actions et je cherchais juste une sélection de cellule, alors je pris un peu de temps pour le comprendre.

Rétrospectivement stupide et évident, mais il m'a fallu quelques heures pour comprendre ce que j'avais fait.

3
DBD

Si vous utilisez uniquement didselect:

self.collectionView.allowsMultipleSelection = false

Ou supprimez cette ligne.

2
Sour LeangChhean

Je viens d'avoir le même problème ... J'étais en train de passer outre dans la vue CollectionCell et cela a empêché le didSelectItemAtIndexPath de se déclencher lorsque j'ai touché la cellule. Suppression du remplacement et tout a fonctionné.

2
digthewells

J'ai rencontré ce problème dans Swift 3 et xcode 8. J'avais une vue et une vue de collection à l'intérieur de cela. implémentation personnalisée dans cette méthode, donc je n'ai pas remplacé cette méthode.Après avoir ajouté le code ci-dessous, la méthode didSelectItem est appelée. 

func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }

Je suis tombé par hasard sur ce problème, et cela m’a frustré un jour jusqu’à ce que j’ai trouvé ceci Vous devez simplement décocher "Interaction utilisateur activée" Lorsque j'ai sélectionné la cellule en haut à gauche dans CollectionView dans Storyboard. et problème résolu

1
Phan Hoang

J'ai rencontré un problème similaire et le coupable s'est révélé être le CardView que j'utilisais dans la hiérarchie de UICollectionView Cell. Dès que j'ai désactivé l'interaction utilisateur pour CardView, collectionView a commencé à répondre aux événements tactiles.

1
Love Kumar

Dans mon cas c'était juste 

self.collectionView.allowsSelection  =NO;

J'ai eu dans le code.

changer pour 

self.collectionView.allowsSelection  =YES;

répare le.

0
user1105951

Essayez de supprimer toutes vos UIGestures de la vue, puis testez pour voir si les cellules UICollectionView peuvent être utilisées normalement.

Dans mon cas, j'ai dû enlever les lignes: 

let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    self.view.addGestureRecognizer(tap)
0
drfalcoew

Au cas où ça aiderait, ça me mordrait de façon idiote de passer quelques heures. Vérifiez si votre cellule personnalisée est en sous-classe UICollectionViewCell au lieu de, disons, UICollectionReusableView ????

0
nandodelauni