我有一个显示一行单元格的tableview控制器。每个单元都有3个按钮。我已将每个单元格的标签编号为1,2,3。问题是我不知道如何找到在哪个单元格上按下了按钮。我目前仅在按下其中一个按钮时才得到发件人的标签。当按下按钮时,是否还有办法获取单元格的行号?
Answers:
您实际上应该使用此方法:
CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
迅捷版:
let buttonPosition = sender.convert(CGPoint(), to:tableView)
let indexPath = tableView.indexPathForRow(at:buttonPosition)
这将为您indexPath
提供所按按钮的位置。然后,cellForRowAtIndexPath
如果需要此单元格或indexPath.row
需要行号,则只需致电。
如果您偏执狂,可以if (indexPath) ...
在使用前进行检查,以防万一indexPath
在表视图上找不到该点。
如果Apple决定更改视图结构,则所有其他答案都可能无效。
convertPoint:*to*View
不是convertPoint:*from*View
。我使用了Xcode自动完成功能,最终使用fromView方法导致无法正常工作...
编辑:这个答案已经过时。 请改用此方法
试试这个:
-(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;
我建议使用这种方式来获取具有任何自定义子视图的单元格的indexPath-(与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是正确的。您可以执行@ user523234建议的操作,但有一点点更改,以尊重应该放在UIButton和UITableViewCell之间的UITableViewCellContentView。因此,修改他的代码:
- (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);
}
如果创建自定义UITableViewCell(您自己的子类),则只需self
在IBAction中进行调用。您可以通过使用情节提要或在设置单元时以编程方式将IBAction功能链接到按钮。
- (IBAction)button1Tapped:(id)sender
{
UITableView* tableView = (UITableView *)self.superview;
NSIndexPath* pathOfTheCell = [tableView indexPathForCell:self];
NSInteger rowOfTheCell = pathOfTheCell.row;
NSLog(@"rowofthecell %d", rowOfTheCell);
}
另一个简单的方法:
在tableView中取得联系
然后获取该点的单元格索引路径
索引路径包含行索引
代码是:
- (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
// ...
}
我想快速共享代码-
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
}
}
迅速:
@IBAction func buttonAction(_ sender: UIButton) {
guard let indexPath = tableView.indexPathForRow(at: sender.convert(CGPoint(), to: tableView)) else {
return
}
// do something
}