【问题标题】:UICollectionView only calling didSelectItemAtIndexPath if user double taps, will not call when user single tapsUICollectionView 仅在用户双击时调用 didSelectItemAtIndexPath,当用户单击时不会调用
【发布时间】:2013-05-02 22:05:17
【问题描述】:

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

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

【问题讨论】:

  • 嗨,克里斯,我也遇到了同样的问题,你知道为什么吗?
  • 我实际上必须做一个工作,在每个单元格中添加我自己的点击手势识别器。我的应用程序的任何其他集合视图中都没有这个问题,只有这个特定的。

标签: ios objective-c ipad uicollectionview uicollectionviewcell


【解决方案1】:

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

【讨论】:

  • 我会继续接受你的回答,不是因为它解决了我的问题,而是因为它解决了一个与我非常相似的问题。
  • 这对我来说开始成为一种仪式。我每次使用UITableViewUICollectionView o.0 时都会回到这个问题
  • 还必须设置collectionView.allowsMultipleSelection = false(默认为false)
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢!设置[tapGestureRecognizer setCancelsTouchesInView:NO]; 为我修复了它。
  • 同时检查self.collectionView.allowsSelection = NO。如果您在代码中发现这一点,请删除该行或将其设置为“是”。设置为 NO 将阻止 didSelectItemAtIndexPath 被调用。
  • 我遇到了同样的问题。我有一个 UICollectionView 没有响应 didSelectItemAtIndexPath 因为我在父视图上有一个 tapGesture 识别器。默认情况下,我将 tapGesture 设置为 tapGesture?.isEnabled = false,因此 didSelectItemAtIndexPath 将处理点击。然后,在我需要使用 tapGesture 的情况下,在我检测远离 UITextField 的点击的情况下,我只需将我的 tapGesture 设置为启用 true,以便我的手势回调将处理点击而不是 didSelectItemAtIndexPath。
  • 救了我!这个答案可能需要对有问题的手势进行一些搜索,最终找到了麻烦制造者并且成功了。
  • @iDifferent 如何在视图的其余部分保留点击手势识别器但让 UICollectionView 被选中?
【解决方案3】:

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

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

view.userInteractionEnabled = NO;

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 这只是花了我 3 个小时......巧合的是,我实现了 shouldHighlight 并返回 false,以测试委托连接。 (shouldHighlight 是委托列表中的第一个方法)。非常感谢!
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

      如果你只使用 didselect:

      self.collectionView.allowsMultipleSelection = false
      

      或者删除那一行。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 嗨,你不需要删除覆盖,你必须调用超级方法!调用超级方法后,它起作用了
        【解决方案8】:

        就我而言,它只是

        self.collectionView.allowsSelection  =NO;
        

        我在代码中。

        改成

        self.collectionView.allowsSelection  =YES;
        

        修复它。

        【讨论】:

          【解决方案9】:

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

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

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

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              【解决方案11】:

              我碰巧偶然发现了这个问题,这让我沮丧了一整天,直到我找到了这个You just need to uncheck "User Interaction Enabled" 当我在 Storyboard 的 CollectionView 内选择左上角的单元格时。问题解决了

              【讨论】:

                【解决方案12】:

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

                【讨论】:

                  【解决方案13】:

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

                  【讨论】:

                    【解决方案14】:

                    记得在类中添加UICollectionViewDataSource、UICollectionViewDelegate

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多