如何在UITableViewCell中获取UIButton的indexPath?

时间:2013-04-26 05:42:46

标签: ios xcode uitableview

我有一个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;
        }
    }

8 个答案:

答案 0 :(得分:28)

我已经尝试了最多的给定答案,但是在我和我通常用于最普遍和理想的方式如下:

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

答案 1 :(得分:13)

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

请改用:

How to know the UITableview row number

答案 2 :(得分:8)

更新回答

使用它像:

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

答案 3 :(得分:7)

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

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

假设您有一个tableview,其中每个单元格代表一个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];
}

答案 7 :(得分:-1)

您可以使用UITableView的{​​{1}}方式indexPathForCell:。祝你好运!