UITableView Cell - получить IndexPath.row от кнопки? - PullRequest
6 голосов
/ 14 августа 2010

У меня в настоящее время есть кнопка, определенная в ячейке, и метод для отслеживания ее действия UITouchDown, как показано:

- (void) clickedCallSign:(id)sender {

    int index = [sender tag];
    NSLog(@"event triggered %@",index);

}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    //Callsign button
    UIButton *button;

    CGRect rect = CGRectMake(TEXT_OFFSET_X, BORDER_WIDTH, LABEL_WIDTH, LABEL_HEIGHT);
    button = [[UIButton alloc] initWithFrame:rect];
    cell.tag=[indexPath row];
    button.tag=[indexPath row];
    [button addTarget:self action:@selector(clickedCallSign:) forControlEvents:UIControlEventTouchDown];
    [button setBackgroundColor:[UIColor redColor]];
    [button setTitle:@"hello" forState:UIControlStateNormal];
    [cell.contentView addSubview:button];
    [button release];   
}

Однако, когда я щелкаю ячейку в симуляторе, появляется сообщение отладки консоли: «событие сработало (пусто)», и вскоре после этого происходит сбой моего приложения.

Как правильно получить значение indexPath.row в моем методе clickedCallSign?

Ответы [ 3 ]

2 голосов
/ 24 сентября 2013

Тег хорош, пока у вас нет ни разделов, ни строк. Попробуйте другой способ получить индексный путь:

- (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPath {

    //...

    [button addTarget:self action:@selector(clickedCallSign:withEvent:) forControlEvents:UIControlEventTouchDown];

    //...

}

// Get the index path of the cell, where the button was pressed
- (NSIndexPath*)indexPathForEvent:(id)event
{
    NSSet *touches = [event allTouches];
    UITouch *touch = [touches anyObject];
    CGPoint currentTouchPosition = [touch locationInView:self.tableView];
    return [self.tableView indexPathForRowAtPoint:currentTouchPosition];
}

- (IBAction)clickedCallSign:(id)sender withEvent:(UIEvent*)event
{
    NSIndexPath* buttonIndexPath = [self indexPathForEvent:event];
}
2 голосов
/ 17 января 2014

Если вы не хотите использовать поле тега, попросите кнопку вызвать этот метод:

- (void)tapAccessoryButton:(UIButton *)sender
{
    UIView *parentView = sender.superview;

    // the loop should take care of any changes in the view heirarchy, whether from
    // changes we make or apple makes.
    while (![parentView.class isSubclassOfClass:UITableViewCell.class])
        parentView = parentView.superview;

    if ([parentView.class isSubclassOfClass:UITableViewCell.class]) {
        UITableViewCell *cell = (UITableViewCell *) parentView;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        [self tableView:self.tableView accessoryButtonTappedForRowWithIndexPath:indexPath];
    }
}
2 голосов
/ 14 августа 2010

Прежде всего, index - это int, поэтому ваш NSLog должен выглядеть следующим образом (обратите внимание на %d):

NSLog(@"event triggered %d", index);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...