繁体   English   中英

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

[英]Adding properties to UIControls without subclassing

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

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

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

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

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

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

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

sender在这里被投射到UIButton

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

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

  1. 从对按钮的引用开始。 (如果你按钮,这就是self 。如果你是按钮的动作目标,那么当按下按钮并发出动作消息时,它会将自身作为参数传递给动作消息,通常称为sender 。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM