在点击识别器时识别表格单元格

Posted

技术标签:

【中文标题】在点击识别器时识别表格单元格【英文标题】:Identifying the table cell, when tapping on a Tap Recogniser 【发布时间】:2012-12-10 08:55:28 【问题描述】:

我的视图中有一个表格视图。单元格是使用自定义单元格创建的。我需要在表格视图单元格中显示一个大字符串所以我在滚动视图中添加了文本标签。当用户点击表格视图单元格时,我还需要执行一些代码。请看以下代码:

 [cell.textLabelLine2 setFrame:CGRectMake(cell.textLabelLine2.frame.origin.x, cell.textLabelLine2.frame.origin.y, 500, cell.textLabelLine2.frame.size.height)];
   cell.scrollView.contentSize = CGSizeMake(cell.textLabelLine2.text.length*10 , 10);
   cell.scrollView.pagingEnabled = NO;

问题是当用户触摸Scroll View上方时,不会调用Tableview did select方法。我为这个问题找到的解决方案是在滚动视图中添加一个手势识别器。但是在这个解决方案中,我们无法检查选择了哪个单元格(或哪个手势识别器)。谁能帮我找到解决这个问题的方法?

【问题讨论】:

【参考方案1】:

您可以通过以下代码了解单元格

if(gestureRecognizer.state == UIGestureRecognizerStateBegan) 
    CGPoint p = [gestureRecognizer locationInView:[self tableView]];

    NSIndexPath *indexPath = [[self tableView] indexPathForRowAtPoint:p];

    if(indexPath != nil) 

        UITableViewCell *cell = [[self tableView] cellForRowAtIndexPath:indexPath];

                    ...
    

【讨论】:

【参考方案2】:

将滚动视图放在滚动视图中通常是个坏主意。 UITableView 也只是一个 UIScrollView。只有当它们在不同的轴上滚动时才有效,即外部滚动视图垂直滚动而内部滚动视图水平滚动。

对于您的特定场景,您必须自己触发选择。一旦你有了对单元格的引用,你就可以向表格视图询问它的 indexPath。然后,您将自己调用 didSelectRow... 的委托方法。

【讨论】:

【参考方案3】:

在带有滚动视图的解决方案中,您无法在滚动视图中滚动,因为gestureRecognizer“获得”了触摸。因此我根本不会使用滚动视图。

使标签调整为它的内容,如:

    CGSize customTextLabelSize = [cell.customTextLabel.text sizeWithFont:cell.customTextLabel.font constrainedToSize:CGSizeMake(cell.customTextLabel.frame.size.width, 999999)];
    cell.customTextLabel.frame = CGRectMake(cell.customTextLabel.frame.origin.x, cell.customTextLabel.frame.origin.y, cell.customTextLabel.frame.size.width, customTextLabelSize.height);

你还需要在 heightForRowAtIndexPath 中实现这个

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    CGSize cellSize = [bigTextString sizeWithFont:customTextLabel.font constrainedToSize:CGSizeMake(generalCellWidth, 999999)];
    return cellSize.height;

这样你就可以使用 didSelectRowAtIndex 方法了。



如果您真的想使用滚动视图,请在 cellForRowAtIndexPath: 方法中向您的单元格添加一个按钮。使按钮与单元格一样大,并添加一个按钮标签,如下所示:

    UIButton *cellButton = [UIButton buttonWithType:UIButtonTypeCustom];
    cellButton.frame = CGRectMake(0, 0, cell.frame.size.width, cell.frame.size.height);
    cellButton.tag = indexPath.row;
    [cellButton addTarget:self action:@selector(cellButtonAction:) forControlEvents:UIControlEventTouchUpInside];
    [cell.contentView addSubview:cellButton];

然后添加:

-(void)cellButtonAction:(UIButton*)sender

    //do something with sender.tag

【讨论】:

以上是关于在点击识别器时识别表格单元格的主要内容,如果未能解决你的问题,请参考以下文章

将手势识别器添加到表格单元格中的图像视图

如何识别已单击的表格单元格?

长按选择的 Swift 3.0 表格视图单元格

如何从表格视图单元格中的图像手势获取 indexPath

在滚动期间点击时,UICollectionView 不再识别单元格上的点击?

Swift - 将手势识别器添加到表格单元格中的对象