2

我在 TableViewCells 中嵌入了 UIButtons。为了跟踪按钮属于哪个单元格,我想向 UIButton 添加一个 NSIndexPath 属性。我不想继承 UIButton。有没有办法可以用类别来做到这一点?

编辑:如果我在表格视图中有多个部分,我相信设置标签的想法将不起作用。访问按钮的超级视图的超级视图以确定单元格的另一种方法似乎更像是一种 hack。寻找一种更清洁的方式来做到这一点。

4

3 回答 3

4

您可以找出单击的按钮所在的单元格,而无需将标签或索引路径与按钮相关联,这在重新使用单元格时会变得混乱。标签确实适用于分段表,但您必须弄乱数字,例如 10001 是第 1 部分,第 1 行,因此您必须在一端转换并在另一端转换回来,这对我来说太脆弱了。

一个更好的方法是使用 UITableView 的indexPathForRowAtPoint:方法。当您的按钮动作被激活时(假设目标在您的表格视图控制器中:

CGPoint point = [sender convertPoint:sender.center toView:self.tableView];
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point];

sender这里是投到UIButton.

于 2011-12-13T17:03:59.337 回答
4

有几种方法。如果你真的需要一个数字而不是完整的索引路径,你可以使用setTag:. 它不灵活,但很容易获得。

下一个最佳解决方案是关联引用。这些可以通过适当的内存管理将数据挂在任何对象上。我通常创建一个类别,添加一个使用objc_setAssociatedObjectand实现的属性objc_getAssociatedObject

于 2011-12-13T16:44:49.220 回答
1

为了跟踪按钮属于哪个单元格

您已经知道按钮属于哪个单元格:它是按钮所在的单元格的子视图。

  1. 从对按钮的引用开始。(如果您按钮,则为self。如果您是按钮的操作目标,则当点击按钮并发出操作消息时,它会将自身作为参数传递给操作消息,通常称为sender。)

  2. 查找视图层次结构 ( superview) 以找到包含该按钮的 UIViewTableCell。

    UIView* v = theButton;
    while (![v isKindOfClass: [UITableViewCell class]]) v = v.superview;
    
  3. 现在你可以用这些信息做任何你喜欢的事情。例如,您似乎想要一个 NSIndexPath;然后打电话-[UITableView indexPathForCell:]

于 2011-12-13T17:27:55.487 回答