55

我有一个大约屏幕大小的 UICollectionView。它显示的 UICollectionViewCells 与 collectionView 的大小相同。每个单元格都有一个 UIImage,它是单元格的大小。CollectionView 启用了分页功能,因此本质上它是一个用户可以滑动浏览的全屏照片幻灯片。

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

4

14 回答 14

204

你确定你没有意外覆盖- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath吗?“选择”与“取消选择”过去曾因 Xcode 的代码完成而让我感到困惑。

于 2013-05-15T16:20:30.463 回答
133

我只是遇到了同样的问题,结果发现里面有一个,UITapGestureRecognizer它正在响应。UIViewUICollectionView

这就解释了为什么didSelectItemAtIndexPath只有当用户用两根手指点击或一根手指长按时才有效,因为这不会触发UITapGestureRecognizer.

所以,检查UITapGestureRecognizer你得到的所有东西,不一定是UICollectionView直接的,但它可以在任何UIView包含它的地方。

于 2013-07-31T22:24:11.033 回答
14

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

您将希望在 NIB 或代码中禁用阻碍视图的用户交互。

view.userInteractionEnabled = NO;

于 2015-04-29T16:00:56.833 回答
8

只需在已经解决的问题中添加一种点击手势可能不起作用的情况,因为这确实一直在折磨我。

如果您falseUICollectionViewDelegate's 内返回collectionView:shouldHighlightItemAtIndexPath:,则点击手势将不起作用,并且collectionView:didSelectItemAtIndexPath:不会调用 。这个委托方法的默认返回值是true,所以如果你不刻意实现它就不会出现问题。

于 2015-08-01T17:03:02.357 回答
3

我自己也遇到了这个问题。最初我有按钮和标签,然后我重构了我的 UI 并将这些按钮/标签变成了UICollectionView.

我最终意识到按钮正在消耗我的水龙头。我不假思索地把原来的按钮移到了单元格中,并没有把它变成一个直线UIImage。我已经破坏了与操作相关的按钮,只是在寻找单元格选择,所以我花了一段时间才弄清楚。

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

于 2015-04-16T12:32:19.447 回答
3

如果你只使用 didselect:

self.collectionView.allowsMultipleSelection = false

或删除该行。

于 2016-12-14T08:18:28.720 回答
2

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

于 2013-11-14T16:49:22.080 回答
2

尝试从视图中删除所有 UIGestures,然后测试 UICollectionView Cells 是否能够正常交互。

就我而言,我不得不删除这些行:

let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    self.view.addGestureRecognizer(tap)
于 2019-01-06T18:51:10.943 回答
2

就我而言,这只是

self.collectionView.allowsSelection  =NO;

我有代码。

更改为

self.collectionView.allowsSelection  =YES;

修理它。

于 2018-01-25T12:05:50.120 回答
1

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

于 2018-07-15T07:03:44.423 回答
1

我碰巧偶然发现了这个问题,它让我沮丧了一整天,直到我发现这个 当我在 Storyboard 的 CollectionView 内选择左上角的单元格时,您只需要取消选中“启用用户交互”即可。问题解决了

于 2017-04-25T02:53:38.073 回答
1

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

func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }
于 2016-11-03T22:04:08.153 回答
0

如果它有帮助,这只会以愚蠢的方式咬我几个小时。仔细检查您的自定义单元格是否是 UICollectionViewCell 的子类,而不是 UICollectionReusableView

于 2018-10-17T16:16:16.037 回答
-1

记得在类中添加UICollectionViewDataSource、UICollectionViewDelegate

于 2017-09-21T12:00:39.217 回答