Как я могу отслеживать путь индекса кнопки в таблице View Cell?

StackOverflow https://stackoverflow.com/questions/2863940

Вопрос

У меня есть представление на столе, где каждая ячейка имеет вид на кнопку аксессуар. Таблица управляется привлеченным контроллером результатов и часто переупорядочена. Я хочу иметь возможность нажать одну из кнопок и получить клетку просмотра индекса в таблице этой кнопки. Я пытался заставить эту работу в течение нескольких дней, хранив строку кнопки в его теге, но когда таблица переупорядочена, строка становится неправильной, и я продолжаю переуправлять теги правильно. Любые новые идеи о том, как отслеживать путь индекса клетки кнопки?

Это было полезно?

Решение

Я создал один метод получения индекса, надеюсь, что это поможет вам.

Создать действие кнопки (Amethod :) в CellForeatindexpath

-(void) aMethod:(UIButton *)sender
{
    // Calling Magic Method which will return us indexPath.
    NSIndexPath *indexPath = [self getButtonIndexPath:sender];

    NSLog(@"IndexPath: %li", indexPath.row);
    NSLog(@"IndexRow: %li", indexPath.section);
}

// Вот магический метод для получения индекса кнопки

-(NSIndexPath *) getButtonIndexPath:(UIButton *) button
{
    CGRect buttonFrame = [button convertRect:button.bounds toView:groupTable];
    return [groupTable indexPathForRowAtPoint:buttonFrame.origin];
}

Другие советы

Если вам неудобно полагаться на button.superview, Этот метод должен быть немного более надежным, чем некоторые другие ответы здесь:

UIButton *button = (UIButton *)sender;
CGRect buttonFrame = [button convertRect:button.bounds toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonFrame.origin];

Это перестало работать с iOS 7; проверить Ответ Майка Веллера вместо

- (IBAction)clickedButton:(id)sender {
    UIButton *button = (UIButton *)sender;
    UITableViewCell *cell = (UITableViewCell *)button.superview;
    UITableView *tableView = (UITableView *)cell.superview;
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];
}

Или короче:

- (IBAction)clickedButton:(id)sender {
    NSIndexPath *indexPath = [(UITableView *)sender.superview.superview indexPathForCell:(UITableViewCell *)sender.superview];
}

Оба непроверены!

Ползание взгляда иерархии с .superview (Как и все существующие ответы демонстрируют) - это действительно плохой способ сделать вещи. Если UITableViewCellСтруктура изменяется (что произошло раньше) ваше приложение сломается. Видимость .superview.superview В вашем коде следует установить сигналы тревоги.

Кнопка и его обработчик должны быть добавлены к пользовательскому UITableViewCell Подкласс и уложил там. Вот где он принадлежит.

Затем подкласс ячеек может затем делегировать событие кнопки через стандартный интерфейс делегата или блок. Вы должны стремиться к чему-то вроде этого:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCustomCell *cell = ...;

    // ...

    cell.onButtonTapped = ^{
        [self buttonSelectedAtIndexPath:indexPath];
    }

    // OR

    cell.delegate = self;

    // ...
}

(Примечание: если вы идете блок маршрута, вам нужно будет использовать __weak Самостоятельная ссылка на предотвращение сохранения циклов, но я думал, что это загромождает пример).

Если вы возьмете маршрут делегата, у вас будет этот метод делегата для реализации:

- (void)cellButtonPressed:(UITableViewCell *)cell
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    // ...
}

Ваш код теперь имеет полный доступ к соответствующему контексту, когда он обрабатывает событие.

Реализация этого интерфейса на вашем классе клеток должно быть простым.

Я не знаю, почему мне нужно добавить руководящий способ дважды, чтобы получить UiableViewCell.

Обновлять:

Спасибо за Qiulang, теперь я получил его.

«Это потому, что SDK теперь добавил частный класс под названием UiableViewCellContentView для UiableViewCell, который сейчас является руководством кнопки». - qiulang

UIButton *button = (UIButton *)sender;
UITableViewCell *cell = (UITableViewCell *)button.superview.superview;
UITableView *curTableView = (UITableView *)cell.superview;
NSIndexPath *indexPath = [curTableView indexPathForCell:cell];

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

-(NSIndexPath*)GetIndexPathFromSender:(id)sender{

    if(!sender) { return nil; }

    if([sender isKindOfClass:[UITableViewCell class]])
    {
        UITableViewCell *cell = sender;
        return [self.tableView indexPathForCell:cell];
    }

    return [self GetIndexPathFromSender:((UIView*)[sender superview])];
}


-(void)ButtonClicked:(id)sender{
    NSIndexPath *indexPath = [self GetIndexPathFromSender:sender];
}

Используйте эту идеальную работу для меня.

CGPoint center= [sender center];
CGPoint rootViewPoint = [[sender superview] convertPoint:center toView:_tableView1];
NSIndexPath *indexPath = [_tableView1 indexPathForRowAtPoint:rootViewPoint];
NSLog(@"%@",indexPath);

Swift 2 Update

Вот как выяснить, какая кнопка была постугнута

 @IBAction func yourButton(sender: AnyObject) {


 var position: CGPoint = sender.convertPoint(CGPointZero, toView: self.tableView)
    let indexPath = self.tableView.indexPathForRowAtPoint(position)
    let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath!)! as
    UITableViewCell
    print(indexPath?.row)
    print("Tap tap tap tap")

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top