web-dev-qa-db-fra.com

La méthode de frappe du délégué UICollectionView n'est pas appelée

J'ai une vue de collection, le délégué de source de données fonctionne bien, mais UICollectionViewDelegatename__:

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"didselect");
}

ne pas être appelé, bien que je mette le délégué (comme je l'ai fait avec la source de données et cela a fonctionné) Je dois mentionner que ma cellule est chargée à partir d'un nib et est connectée à une sous-classe de UICollectionViewCellname__, de toute façon les cellules pas répondre à mon contact. J'ai activé l'interaction utilisateur dans la UIImageViewqui se trouve dans ma cellule.

également :

-(BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"this is caled");
    return YES;
}

ne se fait pas appeler!

comme je l'ai mentionné, j'ai défini:

[self.collectionView setDelegate:self];

et bien sur 

<UICollectionViewDelegate>

de plus, je n'ai pas de substitution touchBegan..

METTRE &AGRAVE; JOUR:

BIZARRE! on l'appelle seulement si j'appuie longuement! comment puis-je résoudre ce problème, je règle NON au contenu de delayContentTouches et je n’ai aucun dispositif de reconnaissance de geste mis en œuvre.

aidez-moi, s'il vous plaît. Merci.

17
henTdev

Il semble qu'il y ait une UITapGestureRecognizer quelque part dans la hiérarchie des vues. Par défaut, UITapGestureRecognizers consomme le toucher reçu, ce qui signifie qu'il n'est pas transmis aux vues situées en dessous dans la hiérarchie. Vous devez trouver le geste de tapotage malhonnête et ajouter cette ligne

tapGestureRecognizer.cancelsTouchesInView = NO;

Cela le fera passer des contacts aux vues en dessous dans la hiérarchie et, espérons-le, résoudre votre problème.

35
aksh1t

On dirait que vous avez ajouté TapGestureRecognizer quelque part et empêche la sélection de la cellule. Vérifiez-les, cela devrait être le problème.

9
Timur Kuchkarov

Je rencontrais le même problème, à savoir que cliquer sur la cellule UICollectionView personnalisée ne détectait pas le clic. Dans mon cas, le problème était que, dans le Xib de CustomCell, userInteraction était activé et que le didSelectItemAtIndexPath de UICollectionview était ne pas être appelé, à la place, les informations de tap de l'utilisateur étaient envoyées à cette cellule particulière pour laquelle je n'avais pas de gestionnaire.

3
user3895738

J'ai eu un problème similaire avec PSUICollectionView (cela fonctionne aussi sur iOS5) et je l'ai corrigé en plaçant un bouton sur mon CollectionViewCell et en définissant la cible de ce bouton Ajoutez également des balises pour savoir quel bouton est enfoncé.

1
Jasper

Ajouter ici comme référence pour les autres personnes à la recherche de la réponse  

Réponse courte:  

Retardez les touches des identificateurs de mouvements par défaut associés à la vue de table: 

    if let gestures = tableView.gestureRecognizers{
        for gesture in gestures {
            gesture.delaysTouchesBegan = true
        }
    }

Explication

Chaque tableview est associée à des identificateurs de geste. Ce qui provoque les retards de contact avec la cellule UItableView personnalisée. Définissez delayTouchesBegan sur true afin que le contact puisse être passé rapidement aux vues secondaires. 

Dans mon cas, il s'agissait de CollectionViewController inside UItableViewCell pour lequel collectionView: didSelectItemAtIndexPath était appelé avec un délai. 

0
object2.0

dans votre fichier .h, importez CellViewController et ajoutez un délégué 

#import "myColleCell.h"

UIViewController<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout>

dans votre fichier .m, ajoutez les codes suivants à votre ViewDidLoad

UINib *cellNib = [UINib nibWithNibName:@"myColleCell" bundle:nil];
[myCollectionView registerNib:cellNib forCellWithReuseIdentifier:@"myColleCell"];
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[flowLayout setItemSize:CGSizeMake(220, 220)];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[myCollectionView setCollectionViewLayout:flowLayout]; 

et mettre en place la cellule avec votre CellViewController

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
              cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier= @"myColleCell";
    myColleCell *cell = (myColleCell *)[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    [cell setupCell:[dataArray objectAtIndex:indexPath.row]];
    //setup cell function methods placed in your CellViewController
    return cell;

}

et enfin, assurez-vous que votre cellView, collectionView est défini comme utilisateur interactif sur YES

0
Wilson L

Assurez-vous qu'aucun objet ne définit la propriété userInteractionEnabled à NO sur la UICollectionViewController.

Comme ce que disent d’autres personnes, j’ai eu le même problème et ce problème a été résolu en supprimant un appel à userInteractionEnabled où la vue parent l’ajoutait en tant que contrôleur de vue enfant. J'ai pu tester cela en ajoutant un UIButton à la cellule et en déterminant que même elle ne pouvait pas recevoir les événements tactiles.

0
Matt Robinson