11

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

8 回答 8

28

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

 CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
 NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
于 2015-11-25T10:30:09.317 回答
13

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

改用这个:

如何知道 UITableview 的行号

于 2014-01-30T15:24:04.017 回答
10

更新的答案

像这样使用它:

CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView]; 
NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint];
于 2013-04-26T05:52:14.753 回答
7

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

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

NSLog(@"%d",indexPath.row);
于 2013-04-26T15:05:14.083 回答
0

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

NSIndexPath *indexPath = [yourtableviewname indexPathForCell:(UITableViewCell *)sender.superview];
   NSLog(@"%d",indexPath.row);
于 2013-04-26T06:05:25.660 回答
0

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

假设您有一个表格视图,其中每个单元格代表一个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];
}
于 2016-08-20T23:19:08.563 回答
0

我建议在您的自定义 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 属性

于 2015-09-26T02:00:46.577 回答
-1

您可以像这样使用UITableView'sindexPathForCell:方法[tableView indexPathForCell:cell];。祝你好运!

于 2013-04-26T05:46:41.197 回答