[英]Adding Notification for DismissViewController without Subclassing
[英]Adding properties to UIControls without subclassing
我在TableViewCells中嵌入了UIButtons。 为了跟踪按钮属于哪个单元格,我想向UIButton添加一个NSIndexPath属性。 我不想将UIButton子类化。 有没有办法可以用类别来做到这一点?
编辑:我相信如果我在表格视图中有多个部分,设置标签的想法将无效。 访问按钮的superview的superview以确定单元格的另一种方法看起来更像是黑客。 寻找一种更干净的方式来做到这一点。
有几种方法。 如果你真的只需要一个数字而不是一个完整的索引路径,你可以使用setTag:
. 它不灵活,但很容易获得。
下一个最佳解决方案是关联参考 。 这些可以通过适当的内存管理将数据挂起到任何对象上。 我通常创建一个类别,添加使用objc_setAssociatedObject
和objc_getAssociatedObject
实现的属性。
您可以找到单击按钮所在的单元格,而无需将标记或索引路径与按钮关联,这在重新使用单元格时会变得混乱。 标签可以处理分段表,但你必须搞乱数字,例如10001是第1部分,第1行,所以你必须在一端转换并转换回另一端,太脆弱了我喜欢。
一个更好的方法是使用UITableView的indexPathForRowAtPoint:
方法。 当您的按钮动作被激活时(假设目标在您的表视图控制器中:
CGPoint point = [sender convertPoint:sender.center toView:self.tableView];
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point];
sender
在这里被投射到UIButton
。
为了跟踪按钮属于哪个单元格
您已经知道该按钮属于哪个单元格:它是该按钮是子视图的单元格。
从对按钮的引用开始。 (如果你是按钮,这就是self
。如果你是按钮的动作目标,那么当按下按钮并发出动作消息时,它会将自身作为参数传递给动作消息,通常称为sender
。)
查找视图层次结构( superview
)来查找含有该按钮的UIViewTableCell。
UIView* v = theButton; while (![v isKindOfClass: [UITableViewCell class]]) v = v.superview;
现在,您可以使用该信息做任何您喜欢的事情。 例如,您似乎想要一个NSIndexPath; 然后调用-[UITableView indexPathForCell:]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.