获取button按下UITableView单元格的行

我有一个表格控制器显示一行单元格。 每个单元格有3个button。 我已经为每个单元格的标签编号为1,2,3。 问题是我不知道如何find一个button被按下的单元格。 我目前只有一个button被按下时才能获得发件人的标签。 有没有办法获得单元格行号以及按下button时?

你应该真的使用这个方法:

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

Swift版本:

 let buttonPosition = sender.convert(CGPoint(), to:tableView) let indexPath = tableView.indexPathForRow(at:buttonPosition) 

这将为您indexPath基于被按下的button位置的indexPath 。 那么如果你需要单元格或indexPath.row ,你只需要调用cellForRowAtIndexPath

如果你是偏执的,你可以检查if (indexPath) ...在使用它之前,只是为了防止在表视图上findindexPath

如果苹果决定改变视图结构,所有其他的答案都可能会被打破。

编辑:这个答案已经过时了。 请改用这个方法


尝试这个:

 -(void)button1Tapped:(id)sender { UIButton *senderButton = (UIButton *)sender; UITableViewCell *buttonCell = (UITableViewCell *)[senderButton superview]; UITableView* table = (UITableView *)[buttonCell superview]; NSIndexPath* pathOfTheCell = [table indexPathForCell:buttonCell]; NSInteger rowOfTheCell = [pathOfTheCell row]; NSLog(@"rowofthecell %d", rowOfTheCell); } 

编辑:如果您使用的是contentView,请使用buttonCell:

 UITableViewCell *buttonCell = (UITableViewCell *)senderButton.superview.superview; 

我会推荐这种方式来获取具有任何自定义子视图的单元格的索引path( 兼容iOS 7以及所有以前的版本

 -(void)button1Tapped:(id)sender { //- (void)cellSubviewTapped:(UIGestureRecognizer *)gestureRecognizer { // UIView *parentCell = gestureRecognizer.view.superview; UIView *parentCell = sender.superview; while (![parentCell isKindOfClass:[UITableViewCell class]]) { // iOS 7 onwards the table cell hierachy has changed. parentCell = parentCell.superview; } UIView *parentView = parentCell.superview; while (![parentView isKindOfClass:[UITableView class]]) { // iOS 7 onwards the table cell hierachy has changed. parentView = parentView.superview; } UITableView *tableView = (UITableView *)parentView; NSIndexPath *indexPath = [tableView indexPathForCell:(UITableViewCell *)parentCell]; NSLog(@"indexPath = %@", indexPath); } 

这也不需要self.tablview

此外,请注意注释代码,如果您希望通过将UIGestureRecognizer的@selector添加到您的自定义子视图中,那么该代码很有用。

有两种方法:

  1. @ H2CO3是对的。 你可以做什么@ user523234build议,但有一个小小的改变,尊重UITableViewCellContentView应该在UIButton和UITableViewCell之间。 所以要修改他的代码:

     - (IBAction)button1Tapped:(id)sender { UIButton *senderButton = (UIButton *)sender; UITableViewCellContentView *cellContentView = (UITableViewCellContentView *)senderButton.superview; UITableViewCell *tableViewCell = (UITableViewCell *)cellContentView.superview; UITableView* tableView = (UITableView *)tableViewCell.superview; NSIndexPath* pathOfTheCell = [tableView indexPathForCell:tableViewCell]; NSInteger rowOfTheCell = pathOfTheCell.row; NSLog(@"rowofthecell %d", rowOfTheCell); } 
  2. 如果你创build一个自定义的UITableViewCell(你自己的子类),那么你可以简单地在IBAction中调用self 。 您可以通过使用故事板或编程设置单元格时将IBActionfunction链接到您的button。

     - (IBAction)button1Tapped:(id)sender { UITableView* tableView = (UITableView *)self.superview; NSIndexPath* pathOfTheCell = [tableView indexPathForCell:self]; NSInteger rowOfTheCell = pathOfTheCell.row; NSLog(@"rowofthecell %d", rowOfTheCell); } 

我假设你在cellForRowAtIndexPath单元格添加button,那么我会做的就是创build一个自定义类的子类UIButton ,添加一个标签叫做rowNumber ,并追加该数据,而您添加button的单元格。

另一种简单的方法

  • 在tableView中获取触摸点

  • 然后获取点的索引path

  • 索引path包含行索引

代码是:

 - (void)buttonTapped:(id)sender { UITapGestureRecognizer *tap = (UITapGestureRecognizer *)sender; CGPoint point = [tap locationInView:theTableView]; NSIndexPath *theIndexPath = [theTableView indexPathForRowAtPoint:point]; NSInteger theRowIndex = theIndexPath.row; // do your stuff here // ... } 

Swift 3

注意:这应该真的在上面接受的答案 ,除了这样的编辑元f 。

 @IBAction func doSomething(_ sender: UIButton) { let buttonPosition = sender.convert(CGPoint(), to: tableView) let index = tableView.indexPathForRow(at: buttonPosition) } 

两点小意见:

  1. 默认function的发件人types为Any,没有转换。
  2. CGPointZero可以被CGPoint()取代

一种解决scheme可能是检查button的超级视图的标签,甚至更高的视图层次(如果button是在单元格的内容视图)。

我想在swift中分享代码 –

 extension UITableView { func indexPathForCellContainingView(view1:UIView?)->NSIndexPath? { var view = view1; while view != nil { if (view?.isKindOfClass(UITableViewCell) == true) { return self.indexPathForCell(view as! UITableViewCell)! } else { view = view?.superview; } } return nil } }