从TableView Objective C获取IndexPath.Row

时间:2014-01-04 22:19:15

标签: ios xcode tableview cell nsindexpath

在问这个问题之前,我在Google和Stackoverflow上搜索了很多。尝试了一些例子,但我不能使这个功能起作用。

由于从iOS 7开始更改了tableview的层次结构,因此很难找到解决方案。

我有一个标准的桌面视图,屏幕上有几个项目和一个按钮。

我需要从tableview中选择一个项目并单击按钮时获取indexPath.row编号。

这是我的代码

- (IBAction)buttonGetNumber:(id)sender {

    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[(UIView *)[button superview] superview]];
    NSLog(@"%i", indexPath.row);
}

无论我从tableview中选择哪个项目,都会一直返回“0”。

我也试过这个(2):

- (IBAction)buttonGetNumber:(id)sender {
    UIButton *button = (UIButton *)sender;
    UITableViewCell *cell = (UITableViewCell *) [[button superview] superview];
    NSIndexPath *index = [self.tableView indexPathForCell:cell];
    NSLog(@"%i", index.row);
}

这也会返回'0'。

我也试过这个(3):

- (IBAction)buttonGetNumber:(id)sender {
    UIButton *senderButton = (UIButton *)sender;
    UITableViewCell *buttonCell = (UITableViewCell *)[[senderButton superview] superview];
    UITableView* table = (UITableView *)[buttonCell superview];
    NSIndexPath* pathOfTheCell = [table indexPathForCell:buttonCell];
    NSInteger rowOfTheCell = [pathOfTheCell row];
    NSLog(@"%i", rowOfTheCell);
}

这会导致应用程序崩溃。

我有什么方法可以解决这个问题吗?

enter image description here

3 个答案:

答案 0 :(得分:4)

创建实例变量_lastClickedRow使用tableview委托设置它,如下所示。当您单击“获取行”按钮时,请使用_lastClickedRow。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    _lastClickedRow = indexPath.row;
}

- (IBAction)buttonGetNumber:(id)sender {

    NSLog(@"%d" , _lastClickedRow);
}

答案 1 :(得分:2)

您只需使用tag设置与UIButton相同的indexPath.row

yourButton.tag = indexPath.row;
didSelectRowForIndexPath:中的

然后在buttonGetNumber:方法中,使用以下命令获取行号:

int rowNum = [(UIButton*)sender tag];

在这里,您可以不使用任何第三个变量。

答案 2 :(得分:1)

如果出于某种原因选择的单元格对您不起作用(例如,对于多选案例),您可以从发件人的框架中获取行:

- (IBAction)buttonGetNumber:(id)sender
{
    CGPoint buttonOrigin = sender.frame.origin;
    CGPoint pointInTableview = [self.tableView convertPoint:buttonOrigin fromView:sender.superview];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:pointInTableview];
    if (indexPath) {
        // Do your work
    }
}