在问这个问题之前,我在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);
}
这会导致应用程序崩溃。
我有什么方法可以解决这个问题吗?
答案 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
}
}