【问题标题】:How to get the indexPath of a UIButton in a UITableViewCell? [duplicate]如何在 UITableViewCell 中获取 UIButton 的 indexPath? [复制]
【发布时间】:2013-04-20 05:13:17
【问题描述】:

我有一个带有多个单元格的UITableview。在每个单元格上,我根据一些数组计数动态添加按钮。因此,当我单击一个按钮时,我可以获得该按钮的 tag 值。但是如何获得该单元格的indexPath

这是我在-cellForRowAtIndexPath中的代码:

   UIView *view=(UIView*)[cell.contentView viewWithTag:indexPath.row+444];

   UIImageView *img=(UIImageView*)[cell.contentView viewWithTag:indexPath.row+999];
   img.image=[UIImage imageNamed:@"BHCS_empty.png"];

   if(integer!=50)
   {
        NSInteger y_axis=0;
        NSArray *Arr=[tableSubCategoryArr objectAtIndex:indexPath.row];
        img.image=[UIImage imageNamed:@"BHCS_selected.png"];

        view.Frame= CGRectMake(0,50,281, integer-50);
        for (int i=0; i<[Arr count]; i++)
        {
            NSLog(@"arr %@",[Arr objectAtIndex:i]);
            UIButton *Btn=[UIButton buttonWithType: UIButtonTypeCustom];
            Btn.frame=CGRectMake(0, y_axis, 281, 44);
            [Btn setImage:[UIImage imageNamed:@"BHCS_panel.png"] forState:UIControlStateNormal];
            [Btn addTarget:self action:@selector(subCategoryBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
            [Btn setTag:i+100];
            [view addSubview:Btn];


            UILabel *nameLbl=[[UILabel alloc]initWithFrame:CGRectMake(20, y_axis,248, 44)];
            nameLbl.text = [[Arr objectAtIndex:i]objectForKey:@"SubCategoryName"];
            nameLbl.textColor = [UIColor whiteColor];
            nameLbl.backgroundColor=[UIColor clearColor];
            panelTableView.separatorColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"BHCS_panel_div1.png"]];
            nameLbl.font = [UIFont fontWithName:@"Helvetica" size:12.0f];
            [view addSubview:nameLbl];

            y_axis=y_axis+44+1.3f;
        }
    }

【问题讨论】:

  • 一个简单的方法是创建一个 UITableView 扩展。请参阅我对this question 的回答,了解如何完成。

标签: ios xcode uitableview


【解决方案1】:

我已经尝试了最多给定的答案,但我通常使用以下最通用和最理想的方式:

 CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
 NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];

【讨论】:

  • Super ... 在 Swift 中 let hitpoint = sender.convert(CGPoint.zero, to: self.tablename) let indexpath_select = self.Flight_detail_table.indexPathForRow(at: hitpoint) print("indexpath: (字符串(描述:indexpath_select))”)
【解决方案2】:

这里所有的答案都很糟糕,你不应该循环浏览超级视图。经典示例,在 iOS 7 中,Apple 更改了 tableViewCell 层次结构,您的应用现在将崩溃!

改用这个:

How to know the UITableview row number

【讨论】:

  • 哦。这是一个如此简短的仅链接答案,我几乎错过了,但实际上非常好。关键是按钮包含有关它在屏幕上的位置的信息,可以很容易地将其转换为索引路径。
  • 你想限定“坏”吗?对 [someView superview] 的固定依赖可能会随着时间的推移而中断(即使整个视图层次结构由应用程序开发人员控制)。但是循环直到找到表格视图单元格现在和将来肯定是安全的。
【解决方案3】:

更新答案

像这样使用它:

CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView]; 
NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint];

【讨论】:

  • 它在 NSIndexPath *indexPath = [view indexPathForCell:cell]; 崩溃
  • 您是否将按钮直接添加到单元格中?如果不是,您需要转到 superview 直到到达 button.superview.superview 等单元格。调试时请检查cell的类型,会有帮助的。
  • 不,不,不,不!只是不要遍历超级视图! stackoverflow.com/questions/9274494/…
  • 我得到了同样的结果。看起来在 iOS 7 中,随着苹果添加 UITableViewCellScrollView:curiousfind.com/blog/646,层次结构发生了变化,因此您需要再添加一个 .superview。 @CW0007007 确实有效,但前提是您具有 self.tableview 属性并且我的屏幕恰好有一大堆表格视图,这使它变得更加棘手。
  • 在 iOS8 中..this 将始终为 0。请参阅此....stackoverflow.com/questions/23784630/…
【解决方案4】:

感谢所有我使用下面的代码解决这个问题

     NSIndexPath *indexPath = [panelTableView indexPathForCell:(UITableViewCell *)sender.superview.superview];

NSLog(@"%d",indexPath.row);

【讨论】:

  • 在 iOS8 中..this 将始终为 0。请参阅此....stackoverflow.com/questions/23784630/…
  • 不要使用这个答案。这是错误的。永远不要为私有视图层次结构假设特定的结构。
【解决方案5】:

这些答案似乎都不是一个非常干净的解决方案。我实现这一点的方式是使用委托模式。视图控制器是单元格的代表,这意味着您让单元格自己处理按钮按下,并在按下按钮时告诉其代表,以便它可以随心所欲地处理它。

假设您有一个表格视图,其中每个单元格代表一个Person 对象,当按下按钮时,您想显示此人的个人资料。您需要做的就是:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customTableViewCell" forIndexPath:indexPath];
    cell.delegate = self;
    cell.person = self.people[indexPath.row];
    return cell;
}

- (void)personCell:(PersonCell *)personCell didPressButtonForPerson:(Person *)person {
    [self showProfileForPerson:person];
}

然后你需要在你的按钮类中添加一个名为buttonPressedHandler的属性,它是一个返回Person实例的块,当你创建你的按钮并添加目标时,做这样的事情:

- (void)viewDidLoad {
    [super viewDidLoad];

    // do whatever whatever else you need/want to here

    [self.button addTarget:self selector:@selector(handleButtonPressed) forState:UIControlStateNormal];
}

- (void)handleButtonPressed {
    // Make sure this is a required delegate method, or you check that your delegate responds to this selector first...
    [self.delegate personCell:self didPressButtonForPerson:self.person];
}

【讨论】:

    【解决方案6】:

    将此代码放入按钮的操作方法中:

    NSIndexPath *indexPath = [yourtableviewname indexPathForCell:(UITableViewCell *)sender.superview];
       NSLog(@"%d",indexPath.row);
    

    【讨论】:

    • 但每次重新调整第零个索引路径
    • 在您的代码中添加按钮以查看这就是为什么它给出 0 值意味着这里 sender.superview 被视为我认为的视图。
    • 嘿我试过这样它现在在按钮操作中工作正常
    • 在 iOS8 中..this 将始终为 0。请参阅此....stackoverflow.com/questions/23784630/…
    【解决方案7】:

    我建议在您的自定义 UITableViewCell 实现类中添加一个属性来存储 indexPath。然后,当您的 cellForRowAtIndexPath 委托在 TableViewController 中触发时,设置该单元格的 indexPath 属性。

    customTableViewCell.h:

    @interface customTableViewCell : UITableViewCell
    
    @property NSIndexPath *indexPath;
    
    @end
    

    customTableViewController 配置单元格:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        customTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customTableViewCell" forIndexPath:indexPath];
        // Do whatever you want with your cell
        cell.indexPath = indexPath;
    
        return cell;
    }
    

    然后你可以通过调用self.indexPath来引用你customTableViewCell中的indexPath属性

    【讨论】:

    • 没有。不要这样做。如果表格视图允许删除、插入或移动行,则此自定义单元格的indexPath 属性将是错误的。
    【解决方案8】:

    您可以使用UITableViewindexPathForCell: 方法,例如[tableView indexPathForCell:cell];。祝你好运!

    【讨论】:

    • 我应该在哪里使用这条线?
    猜你喜欢
    • 2013-03-20
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多