indexPath.row возвращает последнюю видимую ячейку, а didSelectRowAtIndexPath не вызывается

У меня есть NSArray и tableView с некоторыми кнопками, заголовок которых является строкой в ​​массиве в текущей строке indexpath

- (CustomCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexpath {

 _selectedRow = indexpath.row;
 static NSString *simpleTableIdentifier = @"customCell";
 cell = [myTableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

 if (cell == nil) {
  cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
 }

 [cell.playButton setTitle:array[indexpath.row] forState: UIControlStateNormal];

 return cell;

}

Названия кнопок хорошо показаны.

Теперь у меня есть несколько mp3-файлов, имена которых совпадают со строками в массиве, и я хочу воспроизвести файл, соответствующий выбранной ячейке.

fileToPlay = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@", array[_selectedRow]]; ofType:@"mp3"];

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

у меня тоже есть

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexpath {
 _selectedRow = indexpath.row;
}

но если я попытаюсь напечатать _selectedRow здесь, ничего не появляется в журнале.

Когда я нажимаю на ячейку в таблице, она не кажется выделенной (она не серого цвета).

DataSource и делегат также хорошо связаны с таблицей.

ОБНОВИТЬ

Я обнаружил, что если я нажимаю на кнопку, я не нажимаю на выбранную строку. если я нажму на ячейку (вне кнопки), indexPath.row будет правильным.

3 ответа

Решение

Удалите следующую строку из cellForRowAtIndexPath метод.

 _selectedRow = indexpath.row;

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

Установить код:

 - (CustomCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexpath {
 cell.playButton.tag = indexpath.row;
[cell.playButton addTarget:self action:@selector(btnPlay:) forControlEvents:UIControlEventTouchUpInside];
}
- (IBAction)btnPlay:(id)sender{
    UIButton *btn = (UIButton *)sender;
    _selectedRow = btn.tag;
}

Вы выбираете цвет для сенсорного набора цветов. введите описание изображения здесь

Попробуйте это:

1) установите для myGestureRecognizer.cancelsTouchInView значение false... возможно, ваши прикосновения мешают. (Это распространенная проблема, когда у вас могут быть распознаватели жестов)

2) В инспекторе атрибутов вашего tableView установите "Выделение" на одноэлементный. Это решило мою проблему

3) установить это: [tableView setAllowsSelection:YES];

Другие вопросы по тегам