Ios 从TableView目标C获取IndexPath.Row

Ios 从TableView目标C获取IndexPath.Row,ios,xcode,tableview,cell,nsindexpath,Ios,Xcode,Tableview,Cell,Nsindexpath,在问这个问题之前,我在Google和Stackoverflow上搜索了很多。我也尝试了一些例子,但我无法使函数工作 自从iOS 7以来,tableview的层次结构发生了变化,因此很难找到解决方案 我有一个标准的tableview,屏幕上有两个项目和一个按钮 从tableview中选择项目并单击按钮时,需要获取indexPath.row编号 这是我的密码 - (IBAction)buttonGetNumber:(id)sender { NSIndexPath *indexPath =

在问这个问题之前,我在Google和Stackoverflow上搜索了很多。我也尝试了一些例子,但我无法使函数工作

自从iOS 7以来,tableview的层次结构发生了变化,因此很难找到解决方案

我有一个标准的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):

这也会返回一个“0”

我也试过这个(3):

这使得应用程序崩溃

你知道我该怎么解决这个问题吗


创建一个实例变量
\u lastClickedRow
使用tableview委托设置它,如下所示。当您单击“获取行”按钮时,请使用上次单击的行

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

    _lastClickedRow = indexPath.row;
}

- (IBAction)buttonGetNumber:(id)sender {

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

如果由于某种原因选定的单元格不适用于您(例如,对于多选情况),您可以从发件人的框架中获取行:

- (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
    }
}

只需使用以下方法将
ui按钮的
标记设置为与
indexPath.row相同的
tag

yourButton.tag = indexPath.row;
中选择rowforindexpath:

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

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

在这里,您有不使用任何第三个变量的优点。

您是否尝试过(UITableView*)[[buttonCell superview]superview];您已经在示例3中提供了?根据链接的重复问题,执行此操作的首选方法是将按钮的
标记
属性设置为
-tableView:cellforrowatinexpath:
@Darren:我不确定。正如Paul Heller在链接问题中所评论的,如果插入或删除行,标记方法将失败。事实上,我喜欢drexel sharp的“convertToPoint”方法(也在下面给出)。感谢您的回复。在这种情况下,“DidSelectRowatingIndexPath”是代理,对吗?谢谢这对我来说很有效:-)如果不从didselect方法调用该怎么办。但我想从tableview中的按钮知道indexpath.row。有什么解决方案吗?非常感谢。真的很有帮助。如果我有多个tableview,那么如何知道返回行来自特定的表呢?在我的头顶,我会这样做:迭代按钮的
superview
s,直到到达
isKindOfClass:[UITableView类]
的视图。您可以通过这种方式获得相关的
tableView
。我没有使用didselect方法(使用自定义方法)。还有一件事我没有使用customtableview。所以Kindof类:[UITableView类]是否有效?是的,它有效。只要您的自定义视图是表视图(子类),
isKindOfClass…
就可以正常工作。例如,
[aView iskindof class:[UIView class]]
适用于
UITextField
s、
UITableView
s、
UILabel
s等,所有这些都继承自
UIView
yourButton.tag = indexPath.row;
int rowNum = [(UIButton*)sender tag];