NSIndexPath подпрограммы UITableViewCell?

Должен ли быть какой-нибудь доступ к NSIndexPath из под просмотрщика содержимого UITableViewCell?

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

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

Я попробовал только [thisButton superview], но это, похоже, не работает. Любые мысли?

Ответ 1

Я предполагаю, что кнопка отправляет сообщение о событии UIControlEventTouchUpInside на ваш контроллер просмотра? Тогда вы можете сделать что-то вроде:

- (void)buttonPressed:(UIButton *)button
{
    CGPoint location = [button.superview convertPoint:button.center toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
    [self doSomethingWithRowAtIndexPath:indexPath];
}

Ответ 2

Один из возможных вариантов заключается в том, что при создании ячейки для указательного пути вы можете назначить тегу 3 * row_number + <the tag number>. то просто разделите тег на 3, чтобы получить строку и% 3, чтобы получить кнопку.

Ответ 3

Вам не нужно вызывать button.superview. Вы можете перейти прямо из любого поднабора в дереве прямо к представлению таблицы

Objective-C

- (NSIndexPath *)indexPathForCellContainingView:(UIView *)view inTableView:(UITableView *)tableView {
    CGPoint viewCenterRelativeToTableview = [tableView convertPoint:CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds)) fromView:view];
    NSIndexPath *cellIndexPath = [tableView indexPathForRowAtPoint:viewCenterRelativeToTableview];
    return cellIndexPath
}

Swift

func indexPathForCellContainingView(view: UIView, inTableView tableView:UITableView) -> NSIndexPath? {
    let viewCenterRelativeToTableview = tableView.convertPoint(CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds)), fromView:view)
    return tableView.indexPathForRowAtPoint(viewCenterRelativeToTableview)
}