当UICollectionView嵌套在UITableVIew中时,无法进行选择

时间:2012-12-07 13:46:25

标签: ios objective-c uitableview ios6 uicollectionview

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

我可以垂直滚动UITableView并水平滚动嵌套的UICollectionView,但我无法UICollectionViewCell中选择UICollectionView。< / p>

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

永远不会调用UICollectionView's collectionView:didSelectItemAtIndexPath:

8 个答案:

答案 0 :(得分:0)

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

<强>夫特

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

<强>目标C

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

您现在可以使用cellTapped:方法处理正在点按的单元格,您可以获取通过tapRecognizer.view点击的单元格的引用。

答案 1 :(得分:0)

我刚开始工作,所以我想我会和你们分享我的解决方案。

在为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;

希望这有帮助!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您在自定义 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 :(得分:-1)

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

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

答案 5 :(得分:-1)

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

答案 6 :(得分:-1)

尝试为delaysContentTouches停用tableView,并确保正确设置了集合视图的delegate

答案 7 :(得分:-3)

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

请务必:

  1. 在故事板或代码中设置您的tableview并设置其数据源和委托
  2. 在使用tableviewcell出列后,在cellforrowatindexpath中
  3. 获取对相应collectionview的引用并设置其(collectionsviews)数据源和委托
  4. 实现tableviews和collectionviews委托didselect方法并记录他们的调用以查看它的工作原理
  5. 我在编写答案之前刚刚实现了一个小示例项目,以确保没有问题。我可以上传它,如果它仍然不适合你!

    祝你好运!