iOS>> UITableViewCell>>自定义单元>>行号

时间:2013-12-16 09:00:10

标签: ios objective-c uitableview row subclass

UITableViewCell(或其子类)是否有办法识别当前位于哪一行的“正在运行”? - 不是通过didSelectRowAtIndexPath方法......

如果我继承了UITableViewCell并且在其中有一些控制对象(按钮,文本字段等等),并且我希望响应该控件的用法,我希望在考虑单元格当前行时做出响应;在MYTableViewCell.m文件中这样做。

到目前为止,我在创建时将标记属性与行号分配(cellForRowAtIndexPath);然后我可以在MYTableViewCell文件中创建自己的协议,创建一个'委托'属性并将每个单元分配给VC作为其委托并发送消息。但对于一些如此基本的东西来说,这似乎有很多工作要做。

有没有“内置”的方式来做到这一点? 或者更简单的方式......

3 个答案:

答案 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];        

    // ....
}
相关问题