在没有子类化的情况下向UIControl添加属性

时间:2011-12-13 16:30:08

标签: objective-c ios uicontrol

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

编辑:我相信如果我在表格视图中有多个部分,那么设置标签的想法将无效。访问按钮的superview的superview以确定单元格的另一种方法看起来更像是黑客。寻找一种更清洁的方式来做到这一点。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

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

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

sender此处投放到UIButton

答案 2 :(得分:1)

  

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

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

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

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

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