Получение строки ячейки UITableView при нажатии кнопки



У меня есть контроллер tableview, который отображает строку ячеек. Каждая ячейка имеет 3 кнопки. Я пронумеровал теги для каждой ячейки 1,2,3. Проблема я не знаю как найти на какой камере кнопка нажата. В настоящее время я получаю тег отправителя только при нажатии одной из кнопок. Есть ли способ получить номер строки ячейки, а также при нажатии кнопки?

550   10  

10 ответов:

вы действительно должны использовать этот метод:

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 зависимости от положения кнопки, которая была нажата. Тогда вы просто позвоните cellForRowAtIndexPath Если вам нужна клетка или indexPath.row если вам нужен номер строки.

если вы параноик, вы можете проверить if (indexPath) ... перед использованием его на всякий случай indexPath не найден для этой точки в табличном представлении.

все остальные ответы скорее всего, сломается, если Apple решит изменить структуру представления.

редактировать: этот ответ устарел. пожалуйста, используйте этот метод вместо


попробуйте это:

-(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);
}

Edit: если вы используете contentView, используйте это для buttonCell вместо:

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

Я бы рекомендовал этот способ для извлечения 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, добавленный к вашему пользовательскому подвиду.

есть два пути:

  1. @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);
    }
    
  2. Если вы создаете пользовательский 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 добавьте tag под названием rowNumber, и добавить эти данные при добавлении кнопки в ячейку.

еще один простой способ:

  • получить точку касания в 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)
}

два небольших замечания:

  1. функция по умолчанию имеет тип отправителя как любой, который не имеет преобразования.
  2. CGPointZero можно заменить на CGPoint ()

одним из решений может быть проверка тега супервизора кнопки или даже выше в иерархии представлений (если кнопка находится в представлении содержимого ячейки).

Я хотел бы поделиться кодом в 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
    }
}

в swift:

@IBAction func buttonAction(_ sender: UIButton) {
    guard let indexPath = tableView.indexPathForRow(at: sender.convert(CGPoint(), to: tableView)) else {
        return
    }
    // do something
}

Comments

    Ничего не найдено.