从 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】:您只需将UIButton
的tag
设置为与indexPath.row
相同,使用:
yourButton.tag = indexPath.row;
在didSelectRowForIndexPath:
.
然后在 buttonGetNumber: 方法中,您使用以下方法获取行号:
int rowNum = [(UIButton*)sender tag];
在这里,您的优势在于不使用任何第三个变量。
【讨论】:
非常感谢。真的很有帮助。 如果我有多个 tablview 而不是如何知道返回行来自特定表? 在我的脑海中,我会这样做:遍历按钮的superview
s,直到到达isKindOfClass:[UITableView class]
的视图。你可以通过这种方式获取相关的tableView
。
我没有使用 didselect 方法(使用自定义方法)。还有一件事我没有使用 customtableview。所以 isKindOfClass:[UITableView 类] 正在工作?
是的,它有效。只要您的自定义视图是表格视图(子类),isKindOfClass...
就可以正常工作。例如[aView isKindOfClass:[UIView class]]
适用于UITextField
s、UITableView
s、UILabel
s 等,所有这些都继承自UIView
。以上是关于从 TableView Objective C 中获取 IndexPath.Row [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Objective C - 将 JSON 数据从 Tableview 传递到另一个 View Controller
如何在iOS,Objective C的tableview中的每个部分中仅实现单个单元格选择
将BLE外围设备存储在tableview Objective C中