2013-04-26 182 views
9

我有一个UITableview与多个单元格。在每个单元格上,我会根据某些数组动态地添加按钮。所以,当我点击一个按钮时,我可以得到该按钮的值为tag。但是如何获得该细胞的indexPath如何在UITableViewCell中获取UIButton的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; 
     } 
    } 
+0

一个简单的方法是创建一个UITableView扩展。 看到我对[这个问题](https://stackoverflow.com/a/39059239/3395921)的回答,看看它是如何做到的。 – 2016-08-20 22:33:24

回答

6

感谢所有我解决售后服务这个使用下面的代码

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

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

在iOS8 ..这将始终给0.请参阅此.... http://stackoverflow.com/questions/23784630/how-以查找indexpath-for-tap-button-in-tableview -using-seque/27292570#27292570 – 2014-12-04 11:15:58

+0

不要使用此答案。这是错误的。永远不要假设私人视图层次结构的特定结构。 – rmaddy 2017-08-16 15:21:28

-1

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

+0

我应该在哪里使用这条线? – user2230971 2013-04-26 06:12:53

5

更新答案

这样使用它:

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

它崩溃在NSIndexPath * indexPath = [view indexPathForCell:cell]; – user2230971 2013-04-26 06:10:48

+0

你是否将你的按钮直接添加到单元格中?如果没有,你需要去superview,直到你到达像button.superview.superview等单元格。调试时请检查单元的类型,这将有所帮助。 – Amit 2013-04-26 06:31:08

+4

不,不,不!只是不要通过超级视图循环! http://stackoverflow.com/questions/9274494/how-to-know-the-uitableview-row-number/9274863#9274863 – CW0007007 2014-01-30 15:24:28

0

将这个代码在按钮的操作方法:

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

但每次它在你的代码中重新调整零索引路径 – user2230971 2013-04-26 06:18:33

+0

你正在添加按钮来查看这就是为什么它给出0值意味着在这里sender.superview采取我认为如此。 – Balu 2013-04-26 06:20:46

+0

嘿,我试过这样它的工作正常在iOS8中按钮动作 – user2230971 2013-04-26 06:29:19

9

ALLLLL这里的答案很糟糕,你不应该通过超级视图循环。经典示例,使用iOS 7 Apple更改了tableViewCell层次结构,现在应用程序会崩溃!

使用这个代替:

How to know the UITableview row number

+0

哦。这是我几乎错过的一个简短的链接答案,但它确实非常好。重点在于该按钮包含有关屏幕位置的信息,可以轻松将其转换为索引路径。 – Suz 2015-07-21 22:01:35

+0

你想认证“坏”吗? [someView superview]的固定依赖关系可能随时间而中断(即使整个视图层次由应用程序开发人员控制)。但循环直到发现表格视图单元现在和将来都是安全的。 – danh 2017-01-10 15:47:47

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

+1

不,不要这样做。如果表视图允许删除,插入或移动行,则此自定义单元格的'indexPath'属性将会出错。 – rmaddy 2017-08-16 15:23:27

23

指的是你的customTableViewCell的indexPath财产我都试过最大给出的答案,但在和我通常使用去最通用和理想的方式如下:

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

超... 在斯威夫特 生命值让= sender.convert(CGPoint.zero,至:self.tablename) 让indexpath_select = self.Flight_detail_table.indexPathForRow(在:生命值) 打印(“indexpath:\(字符串(描述:indexpath_select))“) – 2018-01-03 13:14:26

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]; 
} 
相关问题