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];