【问题标题】:Selection is not possible when UICollectionView is nested in UITableVIew当 UICollectionView 嵌套在 UITableVIew 中时,无法选择
【发布时间】:2012-11-25 16:54:51
【问题描述】:

我有一个UITableView,其中每个单元格都包含一个UICollectionView

我可以垂直滚动UITableView 并水平滚动嵌套的UICollectionView,但是我不能UICollectionView 中选择UICollectionViewCell

选择在UITableView 中被禁用,在UICcollectionView 中启用(默认状态)。

UICollectionView's collectionView:didSelectItemAtIndexPath: 根本不会被调用。

【问题讨论】:

  • UICollectionViewDelegate 设置了吗?
  • 集合视图中的单元格是否呈现任何点击响应(例如变暗或类似的东西)?也许UITableView 的单元格正在取消集合视图的点击。
  • 您找到解决此 John 的方法了吗?
  • 您找到解决方案了吗?将水平和垂直滚动结合起来总是一个问题,因为每个 UIScrollView 都有自己的行为,而且它们一起不再那么敏感了,我对解决方案很感兴趣!

标签: ios objective-c uitableview ios6 uicollectionview


【解决方案1】:

我能够解决这个问题的方法是向单元格添加一个点击手势识别器来手动处理点击,而不是依赖没有被调用的didSelectRowAtIndexPath

斯威夫特

let tapRecognizer = UITapGestureRecognizer(target: self, action: "cellTapped:")
tapRecognizer.numberOfTapsRequired = 1
cell.addGestureRecognizer(tapRecognizer)

Objective-C

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cellTapped:)];
tapRecognizer.numberOfTapsRequired = 1;
[cell addGestureRecognizer:tapRecognizer];

您现在可以在cellTapped: 方法中处理被点击的单元格,并且您可以通过tapRecognizer.view 获取对被点击的单元格的引用。

【讨论】:

    【解决方案2】:

    我刚刚完成了这项工作,所以我想与你们分享我的解决方案。

    在为UITableView 和嵌套的UICollectionView 设置必要的委托和数据源后,您可以让UICollectionView 成为第一个这样的可选视图

    - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  {
        ...
        [tableViewCell bringSubviewToFront:tableViewCell.yourCollectionView];
        return cell;
    }
    

    这将使UICollectionView成为可以通过委托选择的第一件事

    - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath; 
    

    将使用UITableView 委托选择视图的任何其他部分

    - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      您在自定义UITableViewCell 中拥有的所有视图都应相对于contentView 进行布局。所以总是将它们作为子视图添加到 contentView 并且选择应该可以工作。

      class CustomTableViewCell: UITableViewCell {
          override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
              super.init(style: style, reuseIdentifier: reuseIdentifier)
      
              let view = UIView()
              contentView.addSubview(view)
      
              // layout
          }
      
          required init?(coder aDecoder: NSCoder) {
              fatalError("init(coder:) has not been implemented")
          }
      }
      

      【讨论】:

        【解决方案4】:

        我的第一直觉是两个视图之间的手势识别器可能会发生冲突

        更具体地说,用于点击的 UITableView GRs 可能会阻止 UICollectionView GRs 接收触摸

        【讨论】:

          【解决方案5】:

          首先请检查您是否提供了必要的数据源和委托。 然后,如果您在特定数量的表格视图单元格上使用集合视图,您可以直接放在原型单元格中。请确保您的单元格有适当的限制(宽度)

          【讨论】:

            【解决方案6】:

            尝试为tableView 禁用delaysContentTouches,并确保您的集合视图的delegate 设置正确。

            【讨论】:

              【解决方案7】:

              我已经使用情节提要和编程方式进行了测试,并且它按预期工作。我收到 collectionView:didSelectItemAtIndexPath: 或 tableView:didSelectRowAtIndexPath 取决于点击区域。看来,至少在较新的 SDK(我的是 11.4)中,它是固定的。

              【讨论】:

                【解决方案8】:

                这根本不应该是一个问题!无需自定义手势识别器。无需禁用 tableview 的选择。

                请务必:

                1. 在情节提要或代码中设置您的表格视图并设置其数据源和委托
                2. 在将 tableviewcell 出列后,在 cellforrowatindexpath 中获取对相应 collectionview 的引用并设置其(collectionviews)数据源和委托
                3. 实现 tableviews 和 collectionviews 委托 didselect 方法并记录它们的调用以查看它是否有效

                在我写下这个答案以确保没有问题之前,我刚刚实施了一个小示例项目。如果它仍然不适合你,我可以上传它!

                祝你好运!

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2022-11-18
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-09-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-07-27
                  相关资源
                  最近更新 更多