从 TableView Objective C 中获取 IndexPath.Row [重复]

Posted

技术标签:

【中文标题】从 TableView Objective C 中获取 IndexPath.Row [重复]【英文标题】:Get IndexPath.Row from TableView Objective C [duplicate] 【发布时间】:2014-01-04 22:19:15 【问题描述】:

在问这个问题之前,我在 Google 和 *** 上搜索了很多。还尝试了一些示例,但我无法使该功能正常工作。

自从 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);

这会使应用程序崩溃。

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

【问题讨论】:

你试过了吗 (UITableView *)[[buttonCell superview] superview];您在示例 3 中提供了吗? 根据链接的重复问题,最好的方法是将按钮的tag属性设置为-tableView:cellForRowAtIndexPath:中的表格行号 @Darren:我不确定。正如 Paul Heller 在链接问题中评论的那样,如果插入或删除行,标记方法将失败。其实我喜欢drexel sharp的“convertToPoint”方法(下面也给出)。 【参考方案1】:

创建一个实例变量_lastClickedRow 使用如下表视图委托设置它。当您单击“获取行”按钮时,请使用 _lastClickedRow。

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

    _lastClickedRow = indexPath.row;


- (IBAction)buttonGetNumber:(id)sender 

    NSLog(@"%d" , _lastClickedRow);

【讨论】:

感谢您的回复。在这种情况下,“didSelectRowAtIndexPath”是代表,对吗? 谢谢这对我有用:-) 如果不从 didselect 方法调用怎么办。但我想从 tableview.any 解决方案中的按钮知道 indexpath.row?【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您只需将UIButtontag 设置为与indexPath.row 相同,使用:

yourButton.tag = indexPath.row;

didSelectRowForIndexPath:.

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

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

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

【讨论】:

非常感谢。真的很有帮助。 如果我有多个 tablview 而不是如何知道返回行来自特定表? 在我的脑海中,我会这样做:遍历按钮的superviews,直到到达isKindOfClass:[UITableView class] 的视图。你可以通过这种方式获取相关的tableView 我没有使用 didselect 方法(使用自定义方法)。还有一件事我没有使用 customtableview。所以 isKindOfClass:[UITableView 类] 正在工作? 是的,它有效。只要您的自定义视图是表格视图(子类),isKindOfClass... 就可以正常工作。例如[aView isKindOfClass:[UIView class]] 适用于UITextFields、UITableViews、UILabels 等,所有这些都继承自UIView

以上是关于从 TableView Objective C 中获取 IndexPath.Row [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Objective C - 将 JSON 数据从 Tableview 传递到另一个 View Controller

如何在iOS,Objective C的tableview中的每个部分中仅实现单个单元格选择

将BLE外围设备存储在tableview Objective C中

Objective C TableView清除Json解析

如何获取嵌套 JSON 值并将其加载到 Tableview Objective c 中?

tableview 图像未正确显示 - iOS 8 iPhone App Objective C