3

我正在使用一个 tableView,它加载一个自定义 UITableViewCell,里面有一个“Tap”按钮。当用户单击按钮时调用一个方法。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{...
    [btnRowTap addTarget:self action:@selector(didButtonTouchUpInside:) forControlEvents:UIControlEventTouchDown];
 ...
return cell;
}

在 didButtonTouchUpInside 方法中,我尝试通过以下方式检索所选行的值:

-(IBAction)didButtonTouchUpInside:(id)sender{
UIButton *btn = (UIButton *) sender;
UITableViewCell *cell = (UITableViewCell *)btn.superview;
NSIndexPath *indexPath = [matchingCustTable indexPathForCell:cell];
NSLog(@"%d",indexPath.row);
}

问题是,在任何一行单击按钮时,我每次都得到相同的 0 值。我哪里错了?

4

6 回答 6

9

不能依赖 UITableViewCell 的视图层次结构。这种方法在 iOS7 中会失败,因为 iOS7 改变了单元格的视图层次结构。在你的按钮和 UITableViewCell 之间会有一个额外的视图。

有更好的方法来处理这个问题。

  1. 转换按钮框架,使其相对于 tableview
  2. 向 tableView 询问新框架原点的 indexPath

.

-(IBAction)didButtonTouchUpInside:(id)sender{
    UIButton *btn = (UIButton *) sender;
    CGRect buttonFrameInTableView = [btn convertRect:btn.bounds toView:matchingCustTable];
    NSIndexPath *indexPath = [matchingCustTable indexPathForRowAtPoint:buttonFrameInTableView.origin];

    NSLog(@"%d",indexPath.row);
}
于 2013-08-29T12:02:29.700 回答
5

在设置方法之前将按钮标记cellForRowAtIndexPath设置为方法

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{...
    btnRowTap.tag=indexPath.row
    [btnRowTap addTarget:self action:@selector(didButtonTouchUpInside:) forControlEvents:UIControlEventTouchDown];
 ...
return cell;
}

你点击的单元格变成这样:-

-(IBAction)didButtonTouchUpInside:(id)sender{
{
        UIButton *button = (UIButton*)sender;
        NSIndexPath *indPath = [NSIndexPath indexPathForRow:button.tag inSection:0];
        //Type cast it to CustomCell
        UITableViewCell *cell = (UITableViewCell*)[tblView1 cellForRowAtIndexPath:indPath];
        NSLog(@"%d",indPath.row);

}
于 2013-08-29T10:16:14.913 回答
0

这是您的 ibAction 的代码。您不需要设置任何标签或其他任何东西

 -(IBAction)didButtonTouchUpInside:(id)sender{
  NSIndexPath *indexPath =
        [tbl
         indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
}
于 2013-08-29T12:00:02.317 回答
0

像这样尝试,如果您要向单元格内容视图添加按钮,请使用下面的代码。

 UITableViewCell *buttonCell = (UITableViewCell *)sender.superview.superview;
    UITableView* table1 = (UITableView *)[buttonCell superview];
    NSIndexPath* pathOfTheCell = [table1 indexPathForCell:buttonCell];
    int rowOfTheCell = [pathOfTheCell row];
    int sectionOfTheCell = [pathOfTheCell section];
于 2013-08-29T10:18:28.847 回答
0

btn.superview属于. contentView_ UITableviewCell改为使用btn.superview.superview

于 2013-08-29T10:19:18.157 回答
0

如果您已经知道单元格内的值,那么

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
 UITableViewCell *currentCell = [self tableView:tableView cellForRowAtIndexPath:indexPath];

if ([currentCell.textLabel.text isEqualToString:@"Your Cell Text value" ]){
//Do theStuff here
 }


 }
于 2013-08-29T10:33:11.340 回答