UICollectionView委托的抽头方法没有被调用

我有一个集合视图,数据源委托工作正常,但UICollectionViewDelegate

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

没有被调用,虽然我设置委托(因为我做了数据源,它的工作),我不得不提到,我的细胞是从一个笔尖加载,并连接到UICollectionViewCell的子类,无论如何,单元格不响应我的触摸。 我在我的单元格中的UIImageView中启用了用户交互。

还有:

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

没有被调用!

正如我刚才提到的那样:

 [self.collectionView setDelegate:self]; 

而且当然

 <UICollectionViewDelegate> 

我也没有任何touchBegan覆盖..

更新

奇怪的! 如果我长时间按下,它只会被调用! 我怎样才能解决这个问题,我把delayedContentTouches设置为NO,而且我没有任何手势识别器。

请帮助。 谢谢。

看起来在视图层次结构中有一个UITapGestureRecognizer 。 默认情况下, UITapGestureRecognizer消耗他们接受的触摸,这意味着它不会被传递到层次结构下面的视图。 你需要findstream氓轻拍的手势,并添加此行

 tapGestureRecognizer.cancelsTouchesInView = NO; 

这将使它在层次结构中传递到它下面的视图,并希望解决您的问题。

看起来你已经添加TapGestureRecognizer的地方,它阻止select的单元格。 检查他们,这应该是问题。

我面临着同样的问题,即点击自定义的UICollectionView Cell,它没有检测到点击。 在我的情况下,问题是在CustomCell的Xib中,userInteraction被启用,这就是为什么UICollectionview的didSelectItemAtIndexPath没有被调用,而是用户点击信息被发送到特定的单元格,我没有处理程序。

我有一个与PSUICollectionView类似的问题(这也适用于iOS5),我通过在我的CollectionViewCell上放置一个button并设置该button的目标来修复它。同时添加标签来知道哪个button被按下。

也许你应该在集合视图上使用轻击手势。

在你的.h文件中,导入CellViewController并添加委托

 #import "myColleCell.h" UIViewController<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout> 

在你的.m文件中,将下面的代码添加到你的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]; 

并用你的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; } 

最后确保你的cellView,collectionView被设置为YES

确保没有任何对象将UICollectionViewController上的userInteractionEnabled属性设置为NO

类似于其他人所说的,我有这个相同的问题,并通过删除调用userInteractionEnabled调用,其中父视图添加它作为子视图控制器。 我能够通过添加一个UIButton来testing这个单元格,并确定即使它不能接收触摸事件。

添加这里作为其他人正在寻找答案的参考

简答:

延迟与tableview关联的默认手势识别器的触摸:

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

说明

每个tableview都有与之相关的手势识别器。 这导致触摸延迟自定义UItableView单元格。 将delaysTouches设置为true,以便可以将触摸快速传递给子视图。

在我的情况下,它是UIViewViewCell中的CollectionViewController ,其中collectionView:didSelectItemAtIndexPath被延迟调用。