如果用户双击,UICollectionView只调用didSelectItemAtIndexPath,当用户单击时不会调用

时间:2013-05-08 15:34:41

标签: ios objective-c ipad uicollectionview uicollectionviewcell

我有一个大小与屏幕大小相同的UICollectionView。它显示的UICollectionViewCells与collectionView的大小相同。每个细胞都有一个UIImage,它是细胞的大小。 CollectionView启用了分页,因此它实际上是用户可以滑动的全屏照片幻灯片。

问题在于 只有当用户在一个单元格上用两根手指敲击或用一根手指长按然后释放时才会调用-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath。它似乎没有单击选择的默认行为。我没有对CollectionView手势识别器进行任何更改,因此无法找到解决此问题的方法。

14 个答案:

答案 0 :(得分:200)

您确定不会意外地覆盖- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath吗? “选择”与“取消选择”在Xcode的代码完成过程中让我绊倒了。

答案 1 :(得分:125)

我遇到了同样的问题,结果发现UITapGestureRecognizer上有一个UIView,其中包含UICollectionView而它正在响应。

这解释了为什么didSelectItemAtIndexPath仅在用户用两根手指敲击或用一根手指长按时才起作用,因为这不会触发UITapGestureRecognizer

因此,请检查您到达的所有UITapGestureRecognizer,而不是直接UICollectionView,但可以在包含它的任何UIView上。

答案 2 :(得分:13)

如果您对单元格有一个视图阻碍了难以处理的单元格内容视图,那么您将无法挂钩该单元格的委托回调。

您需要在NIB或代码中禁用阻碍视图上的用户交互。

view.userInteractionEnabled = NO;

答案 3 :(得分:8)

只需在已经解决的问题中再添加一个点击手势可能不起作用的情况,因为这确实会让我感到痛苦。

如果您在false UICollectionViewDelegate'内返回collectionView:shouldHighlightItemAtIndexPath:,则点击手势将无法运行,并且不会调用collectionView:didSelectItemAtIndexPath:。此委托方法的默认返回值为true,因此如果您没有故意实现它,则不会出现问题。

答案 4 :(得分:3)

我自己也遇到了这个问题。最初我有按钮和标签,然后我重构了我的UI并将这些按钮/标签转换为UICollectionView的单元格。

我最终意识到按钮正在消耗我的水龙头。我不假思索地把原来的按钮移到牢房里,而不是把它变成直的UIImage。我已经破坏了相关按钮的动作,只是在寻找细胞选择,所以我花了一些时间来弄清楚它。

回想起来,愚蠢而且显而易见,但花了几个小时才意识到我做了什么。

答案 5 :(得分:2)

我遇到了同样的问题......我在CollectionCell视图中覆盖了touchesBegan,这导致didSelectItemAtIndexPath在我触摸单元格时不会触发。删除了覆盖,一切正常。

答案 6 :(得分:2)

如果您只使用didselect:

self.collectionView.allowsMultipleSelection = false

或删除该行。

答案 7 :(得分:1)

我在Swift 3和xcode 8中遇到了这个问题,我在这里有一个视图和一个集合视图。集合视图有userInteractionEnabled为true,但仍然无法正常工作。通过覆盖shouldHighlightItemAt修复此问题,我没有此方法中的任何额外/自定义实现,所以我没有覆盖此方法。添加下面的代码后,调用didSelectItem方法。

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

答案 8 :(得分:1)

我碰巧偶然发现了这个问题,在我找到这个问题之前,我感到很沮丧You just need to uncheck "User Interaction Enabled" 当我选择Storyboard中CollectionView左上方的Cell时。问题解决了

答案 9 :(得分:1)

就我而言,它只是

self.collectionView.allowsSelection  =NO;

我有代码。

更改为

self.collectionView.allowsSelection  =YES;

修复它。

答案 10 :(得分:1)

我遇到了类似的问题,在我看来,罪魁祸首是我在UICollectionView Cell的继承结构中使用的CardView。一旦我禁用CardView的用户交互,collectionView就开始响应触摸事件。

答案 11 :(得分:0)

以防万一,这只是愚蠢地咬了我几个小时。仔细检查您的自定义单元格是否是UICollectionViewCell的子类,而不是UICollectionReusableView

答案 12 :(得分:0)

尝试从视图中删除所有UIGesture,然后进行测试以查看UICollectionView单元是否能够正常交互。

就我而言,我必须删除以下行:

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

答案 13 :(得分:-1)

请记住将UICollectionViewDataSource,UICollectionViewDelegate添加到类