Вместо этого вам действительно стоит использовать этот метод:
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;
источник
contentView
свойству, поэтому это решение на самом деле не работает.Я бы порекомендовал этот способ получить indexPath ячейки, которая имеет любое настраиваемое subview - ( совместим с 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
.Также обратите внимание на закомментированный код, который полезен, если вы хотите, чтобы то же самое через @selector UIGestureRecognizer было добавлено в ваше настраиваемое подвид.
источник
Есть два способа:
@ H2CO3 правильно. Вы можете сделать то, что предложил @ user523234, но с небольшими изменениями, чтобы уважать 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); }
Если вы создаете пользовательский 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); }
источник
Я предполагаю, что вы добавляете кнопки в ячейку
cellForRowAtIndexPath
, тогда я бы создал подкласс настраиваемого классаUIButton
, добавил тег с именемrowNumber
и добавил эти данные при добавлении кнопки в ячейку.источник
UIButton
.tag
является общим свойствомUIView
.Другой простой способ:
Получите точную информацию в 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 // ... }
источник
Swift 3
Примечание: это действительно должно быть в принятом ответе выше, за исключением того, что мета не одобряет такие изменения.
@IBAction func doSomething(_ sender: UIButton) { let buttonPosition = sender.convert(CGPoint(), to: tableView) let index = tableView.indexPathForRow(at: buttonPosition) }
Два незначительных комментария:
источник
Одним из решений может быть проверка тега супервизора кнопки или даже выше в иерархии представления (если кнопка находится в представлении содержимого ячейки).
источник
Я хотел бы быстро поделиться кодом -
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 }
источник