获取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添加到您的自定义子视图中,那么该代码很有用。
有两种方法:
-
@ 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); }
-
如果你创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) }
两点小意见:
- 默认function的发件人types为Any,没有转换。
- 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 } }
- 防止在Xcode中使用iOS iPhone应用程序部署(禁用)WatchKit应用程序
- 什么是UIView的内容压缩和内容拥抱?
- CLLocationManager startUpdatingLocation不调用locationManager:didUpdateLocations:或locationManager:didFailWithError:
- 如何识别导航堆栈中的前一个视图控制器
- 删除UITableView中的UITableViewCells之间的行
- 当应用程序处于前台时显示本地通知Swift 3
- Xcode6:embedded式二进制文件未使用与父应用程序相同的证书进行签名
- UIActivityViewController – 电子邮件和Twitter分享
- Xcode 8:函数types不能有参数标签打破我的构build