UICollectionView 的 didSelectItemAt 仅在双击时调用

Posted

技术标签:

【中文标题】UICollectionView 的 didSelectItemAt 仅在双击时调用【英文标题】:didSelectItemAt for UICollectionView is only calling on double touch 【发布时间】:2017-10-25 14:11:26 【问题描述】:

我在使用 ios11 模拟器的 UICollectionView 中遇到了一个奇怪的问题。在我的项目中,我有一个UICollectionViewUIImageView 作为单元格,并且我通过将其拖动到视图控制器来为单元格创建segue 作为触发的Segues。它工作得很好,但知道 segue 没有执行,所以我决定从触发 Segues 的单元格中删除 segue,我创建了一个从我的视图控制器到目标视图控制器的 segue,并从代码执行 segue

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoCell", for: indexPath) as! PhotoCell
    if let url = URL(string: "\(StringResources.serverAddress)/Content/images/Files/Thumb/\(photos[indexPath.row])") 
        cell.image.downloadFrom(url: url)
    
    return cell


func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
    print("clicked")
    performSegue(withIdentifier: "PhotoSegue", sender: collectionView.cellForItem(at: indexPath))

但它也不起作用,并且控制台中没有单击打印。我已经检查了单元格和UIImageView 用户交互也UICollectionView 委托是好的。我该如何解决?


编辑:我发现了问题。只有当我双击单元格时它才会调用

【问题讨论】:

你能分享更多关于你的细胞的信息吗? 它只有一个UIImageView @jvrmed 是的,我已经提到它已设置为我的视图控制器,我在代码中再次执行此操作,但没有帮助 @OzgurVatansever 发布您的collectionView(_:cellForItemAt:) 代码。此外,在您的视图控制器的 viewDidAppear(_:) 方法中,添加代码 print("collection view data source = " + myCollectionView.dataSource) 并检查显示的内容。 我不确定我们的情况是否相似,但对我来说,问题是我在整个视图中添加了一个UITapGestureRecognizer 以关闭键盘并删除它解决了问题@Rajesh跨度> 【参考方案1】:

您可以检查一些事情,一旦所有事情都按顺序进行,它应该可以工作:

    检查您的UICollectionView 是否同时设置了委托和数据源。 检查您的 UIImageView userInteractionEnabled 属性是否设置为 false

根据文档:

默认情况下,图像视图会忽略用户事件。通常,您使用图像视图仅在界面中呈现视觉内容。如果您还希望图像视图处理用户交互,请将其 isUserInteractionEnabled 属性的值更改为 true。之后,您可以附加手势识别器或使用任何其他事件处理技术来响应触摸事件或其他用户启动的事件。

    检查UICollectionView 和父级是否都有。 userInteractionEnabled 属性设置为 true。 检查没有其他UIGestureRecognizers 捕捉到您的触摸事件。 检查没有网络请求冻结您的 UI。

考虑到您提供的信息,我会尝试从单元格中删除UIImageView,并确保在添加更多元素之前单元格触摸工作正常。

【讨论】:

它不工作。我已经编辑了我的帖子,请阅读最后一行 你需要分享更多信息,你的单元类,可能还有你的控制器,肯定有另一个元素会干扰你的视图 还有其他你正在实现的 UICollectionViewDelegate 方法吗? 不,它只是单元格中的部分和项目,并且确实选择了项目 查看***.com/questions/26351819/…【参考方案2】:

问题是我添加了一个UITapGestureRecognizer 来关闭键盘,并且正在捕获触摸事件。

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

【讨论】:

告诉你有另一个 UITapGestureRecognizer 在我的回答的第 5 项上阻止你的事件 是的,你是对的,对不起,我忘了接受答案@jvrmed 最后,这应该是公认的解决方案。【参考方案3】:

问题可能是由于集合视图具有 didSelectItemAt 方法以及 didDeselectItemAt 每次点击交替的方法。这可以解释为什么它只能在双击时工作(一次单击调用 didSelect,下一次调用 didDeselect)。

一个快速(但不优雅)的解决方案可能是实现您的 didDeselectItemAt 并使用它来调用 didSelectItemAt

【讨论】:

以上是关于UICollectionView 的 didSelectItemAt 仅在双击时调用的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从集合视图传递到表视图类?

委托不会执行功能

未调用 didSelectCellAtIndexPath

如何滚动另一个 UICollectionView 下方的 UICollectionView?

折叠UICollectionView

将标题添加到 UICollectionView,而不是 UICollectionView 的部分