iPhone - Как определить, в какой ячейке была нажата кнопка в пользовательском UITableViewCell - PullRequest
19 голосов
/ 23 июня 2009

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

Ответы [ 10 ]

19 голосов
/ 19 января 2010

Гораздо более простым решением будет определить ваш обратный вызов кнопки с (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) sender; Дополнительные Аргумент обратного вызова есть, не нужно ничего делать, чтобы получить его. Также не забудьте подключить вашу кнопку к новому обратному вызову в Интерфейсном Разработчике!

10 голосов
/ 23 июня 2009

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

5 голосов
/ 21 августа 2012

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

- (void)btnPressed:(id)sender event:(id)event
{
  UITouch *touch = [[event allTouches] anyObject];
  CGPoint touchPoint = [touch locationInView:self.tableView];
  NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:touchPoint];
}
4 голосов
/ 03 ноября 2009

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

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

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

3 голосов
/ 14 февраля 2015

Вот пример 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

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

3 голосов
/ 08 февраля 2010

Еще проще:

-(IBAction) buttonPressed {
    NSIndexPath *myIndexPath = [(UITableView *)self.superview indexPathForCell: self];
    // do whatever you need to do with the information
}
1 голос
/ 22 июня 2012

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

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

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

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

    [[слой btn] setValue: indexPath forKey: @ "indexPath"];

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

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

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

1 голос
/ 23 июня 2009

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

0 голосов
/ 09 августа 2014

это решение также работает в 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);
}
0 голосов
/ 24 мая 2014
    [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]]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...