UITableViewCell子视图的NSIndexPath?

5
有没有办法获取UITableViewCell的contentView子视图的NSIndexPath?
在我的情况下,我有一个表视图,每一行都被分成3个按钮。我可以使用按钮标签来跟踪它是哪一列,但我还需要知道它是表视图的哪一行子视图(当用户点击按钮时)。
因为按钮阻止了整个实际表视图行,所以不会调用didSelectRowAtIndexPath(这是预期的),因此我无法通过这种方式获取它。
我尝试过只是使用[thisButton superview],但似乎不起作用。有什么想法吗?
3个回答

20

我假设按钮正在向您的视图控制器发送其UIControlEventTouchUpInside事件消息?那么你可以这样做:

- (void)buttonPressed:(UIButton *)button
{
    CGPoint location = [button.superview convertPoint:button.center toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
    [self doSomethingWithRowAtIndexPath:indexPath];
}

2
这个答案实际上更符合我的预期,而且更加优雅。 - Keller
1
同样也能够免疫行的插入、删除或重新排列,如果你选择这样做。 - gschandler
嗯...看起来我的第三列按钮好像不起作用。它可以正确转换触摸位置,但是在indexPathForRowAtPoint中,对于第三列中的每个按钮都返回0(虽然前两列可以正常工作)。这可能与横向视图有关吗? - Keller
抱歉,我转换的坐标系错误了。由于我使用了按钮“center”,所以我应该从它的“superview”坐标系进行转换。我已经更新了代码片段。 - gschandler

2

一种可能的选项是,在为索引路径创建单元格时,您可以分配标签为3 * row_number + <标记号码>。然后,只需将标签除以3即可得到行数,%3即可得到按钮。


1

您不需要调用button.superview。您可以直接从树中的任何子视图到达表视图

Objective-C

- (NSIndexPath *)indexPathForCellContainingView:(UIView *)view inTableView:(UITableView *)tableView {
    CGPoint viewCenterRelativeToTableview = [tableView convertPoint:CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds)) fromView:view];
    NSIndexPath *cellIndexPath = [tableView indexPathForRowAtPoint:viewCenterRelativeToTableview];
    return cellIndexPath
}

Swift

func indexPathForCellContainingView(view: UIView, inTableView tableView:UITableView) -> NSIndexPath? {
    let viewCenterRelativeToTableview = tableView.convertPoint(CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds)), fromView:view)
    return tableView.indexPathForRowAtPoint(viewCenterRelativeToTableview)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接