UITableViewCell(或其子类)是否有办法识别当前位于哪一行的“正在运行”? - 不是通过didSelectRowAtIndexPath方法......
如果我继承了UITableViewCell并且在其中有一些控制对象(按钮,文本字段等等),并且我希望响应该控件的用法,我希望在考虑单元格当前行时做出响应;在MYTableViewCell.m文件中这样做。
到目前为止,我在创建时将标记属性与行号分配(cellForRowAtIndexPath);然后我可以在MYTableViewCell文件中创建自己的协议,创建一个'委托'属性并将每个单元分配给VC作为其委托并发送消息。但对于一些如此基本的东西来说,这似乎有很多工作要做。
有没有“内置”的方式来做到这一点? 或者更简单的方式......
答案 0 :(得分:3)
查看
- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell
方法。我倾向于向单元格添加一个tableView属性,并在创建具有该单元格的tableView的单元格时设置它。然后致电:
[tableView indexPathForCell:cell]
返回该单元格的indexPath,为您提供section和row。这比使用标签当然要好,因为它包含节,并且始终有效,即使单元格改变位置(其他位置插入或删除,或者实际移动)。
答案 1 :(得分:1)
您可以使用cellatrowforindexpath方法执行此类操作。 例如,如果你想在按钮点击上执行某些操作,你可以这样做。
cell.buttonName.tag=indexPath.row;
并且您附加到该按钮的操作就是这样。
(ibaction)performsomeAction:(id)sender{
UIButton *btn=(UIButton*)sender;
nslog(@"the row on which i have clicked is %d",btn.tag);
}
这将告诉您当前的哪一行。
答案 2 :(得分:0)
在触摸其中的控件后,有多种方法可以获取单元格的索引路径,而不使用标记属性或将单元格与其表视图耦合。
首先要做的是将target-action添加到按钮中,如下所示:
[button addTarget:cell action:@selector(buttonTapped:withEvent:) forControlEvents:UIControlEventTouchUpInside];
然后您可以使用操作方法的事件参数:
- (void)buttonTapped:(id)sender withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
// ....
}
或者用于检索单元格的视图层次结构:
- (void)buttonTapped:(id)sender withEvent:(UIEvent *)event
{
UITableViewCell *cell = (UITableViewCell *)[[sender superview] superview];
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
// ....
}
或发件人(即控件)的位置:
- (void)buttonTapped:(id)sender withEvent:(UIEvent *)event
{
CGPoint position = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:position];
// ....
}