我有一个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;
}
}
答案 0 :(得分:28)
我已经尝试了最多的给定答案,但是在我和我通常用于最普遍和理想的方式如下:
CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
答案 1 :(得分:13)
这里的答案很糟糕,你不应该在超级浏览中循环。经典示例,iOS 7 Apple更改了tableViewCell
层次结构,您的应用程序现在将崩溃!
请改用:
答案 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:
。祝你好运!