Подтвердить что ты не робот

IPhone - Как определить, в какой ячейке нажата кнопка в пользовательском UITableViewCell

В настоящее время у меня есть UITableView, который заполнен пользовательским UITableViewCell, который находится в отдельном наконечнике. В ячейке есть две кнопки, которые связаны с действиями в пользовательском классе ячейки. Когда я нажимаю одну из кнопок, я могу вызвать правильный метод, но мне нужно знать, в какую строку была нажата кнопка. Свойство тега для каждой кнопки подходит как 0. Мне не нужно знать, когда вся ячейка выбирается, только когда нажата конкретная кнопка, поэтому мне нужно знать, какая строка она есть, поэтому я могу обновить соответствующий объект.

4b9b3361

Ответ 1

Гораздо проще решить определить обратный вызов вашей кнопки с отправителем (id) и использовать его для вычитания индекса строки таблицы. Вот пример кода:

- (IBAction)buttonWasPressed:(id)sender
{
    NSIndexPath *indexPath =
        [self.myTableView
         indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
    NSUInteger row = indexPath.row;

    // Do something with row index
}

Скорее всего, вы использовали тот же индекс строки для создания/заполнения ячейки, поэтому должно быть тривиально определить, что должна делать ваша кнопка. Не нужно играть с тегами и стараться держать их в порядке!

Уточнение:, если вы в настоящее время используете - (IBAction) buttonWasPressed; просто переопределите его как - (IBAction) buttonWasPressed: (id) отправитель; Дополнительный аргумент обратного вызова есть, нет необходимости делать что-либо дополнительное, чтобы получить его. Также не забудьте снова подключить свою кнопку к новому обратному вызову в Interface Builder!

Ответ 2

Вы можете использовать свойство tag на кнопке, чтобы указать, в какой строке была создана кнопка, если вы не используете теги ни для чего другого.

Ответ 3

У меня такой же сценарий. Для этого я получил пользовательскую ячейку. Я добавил два свойства, раздел и строку. Я также добавил владельца, который будет моим производным классом TableViewController. Когда запрашиваются ячейки, я устанавливаю раздел/строку на основе indexPath вместе с владельцем.

cell.section = indexPath.section cell.row = indexPath.row cell.owner = self

Следующее, что я сделал, - это когда я создал кнопки, я ассоциирую события кнопки с ячейкой, а не с tableViewController. Обработчик событий может прочитать запись раздела и строки и отправить соответствующее сообщение (или событие) в TableViewController. Это значительно упрощает ведение домашнего хозяйства и техническое обслуживание за счет использования существующих методов и ведения домашнего хозяйства и обеспечения максимальной сохранности клетки. Поскольку система уже отслеживает ячейки, зачем делать это дважды!

Ответ 4

Для реализации, не зависящей от тегов или иерархии представлений, выполните следующие действия

- (void)btnPressed:(id)sender event:(id)event
{
  UITouch *touch = [[event allTouches] anyObject];
  CGPoint touchPoint = [touch locationInView:self.tableView];
  NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:touchPoint];
}

Ответ 5

Еще проще:

-(IBAction) buttonPressed {
    NSIndexPath *myIndexPath = [(UITableView *)self.superview indexPathForCell: self];
    // do whatever you need to do with the information
}

Ответ 6

Вот пример Swift...

Класс UIControl является суперклассом различных виджетов iOS, включая UIButton, поскольку UIControl предоставляет механизм назначения/действия, который отправляет уведомления о событиях. Поэтому общий способ справиться с этим состоит в следующем:

func actionHandler(control: UIControl)
   var indexPath = tableView.indexPathForCell(control.superview!.superview! as UITableViewCell)!
   var row = indexPath.row
}

Здесь приведен пример настройки кнопки управления для доставки действия. Кроме того, создайте @IBAction и визуально создайте действие с помощью Interface Builder.

button.addTarget(self, action: "actionHandler:", forControlEvents: .TouchUpInside)

Вы можете понизить параметр UIControl до UIButton, UIStepper и т.д. по мере необходимости. Например:

var button = control as UIButton

Контроль управления - это UITableViewCell contentView, чьи подпункты представляют собой UIViews, отображаемые в ячейке (UIControl является подклассом UIView). Супервидом ячейки содержимого является сам UITableViewCell. Вот почему это надежный механизм, и надзор можно преодолеть безнаказанно.

Ответ 7

Вы можете получить доступ к кнопкам superview, чтобы получить UITableViewCell, который содержит вашу кнопку, но если вам просто нужен номер строки, вы можете использовать свойство tag, как предыдущее сообщение deacribes.

Ответ 8

Существует несколько способов устранения проблемы.

  • Вы можете использовать свойство "tag" Дайте значение indexPath.row как значение тега для кнопки.
    btn.tag = indexPath.row;

Затем в функции кнопки вы можете легко получить доступ к значению тега, и это будет индекс для нажатой кнопки.

-(void)btnClicked:(id)sender
{
    int index = [sender tag];
}
  • Вы можете использовать свойство layer Добавьте indexPath в качестве значения в словаре слоев.

    [[btn layer] setValue: indexPath forKey: @ "indexPath" ];

Этот indexPath доступен из функции действия кнопки.

-(void)btnClicked:(id)sender
{
    NSIndexPath *indexPath = [[sender layer] valueForKey:@"indexPath"];
    int index = indexPath.row;
}

С помощью этого метода вы можете передать несколько значений функции кнопки, просто добавив новые слова в словарь с разными клавишами.

Ответ 9

    [btnFavroite setAccessibilityValue:[NSString stringWithFormat:@"%d",indexPath.row]];
    [btnFavroite setAccessibilityLabel:btnFavroite.titleLabel.text];
    [btnFavroite addTarget:self action:@selector(btnFavClick:) forControlEvents:UIControlEventTouchUpInside];

-(void)btnFavClick:(id)sender{
    UIButton *btn=(UIButton *)sender;
    int index=[btn.accessibilityValue integerValue]]
}

Ответ 10

это решение также работает в IBAction, подключенном с использованием прототипа ячейки раскадровки

- (IBAction)viewMapPostsMarker:(UIButton*)sender{
    // button > cellContentView > cellScrollView > cell
    UITableViewCell *cell = (UITableViewCell *) sender.superview.superview.superview; 
    NSIndexPath *index = [self.mapPostsView indexPathForCell:cell];
    NSLog(@" cell at index %d",index.row);
}