0

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

- (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 и делегат также хорошо связаны с табличным представлением.

UPDATE

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

+0

Попробуйте это: набор myGestureRecognizer.cancelsTouchInView ложной –

+1

почему вы добавляете _selectedRow = indexpath.row; в cellForRowAtIndex? –

+0

Вы уверены, что 'didSelectRowAtIndexPath' даже вызывается, когда вы выбираете ячейку? Возможно, он не будет выбран вообще, что оставит ваш '_selectedRow' в качестве последней загруженной ячейки (внизу, если вы прокручиваете вниз, сверху, если вы прокручиваете ...). – Putz1103

ответ

2

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

_selectedRow = indexpath.row; 

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

+0

Да, я просто пытался. но проблема здесь в том, что, когда я нажимаю на кнопку в ячейке, я не нажимаю на ячейку, поэтому выбранный Row не обновляется. если я нажимаю на ячейку (вне кнопки), это так. – fabersky

+0

Вам действительно нужна кнопка? Кажется, что кнопка потребляет событие касания. Можете ли вы попробовать установить button.userInteractionEnabled = NO; на кнопке внутри ячейки? –

+0

Мне нужно это для воспроизведения звука – fabersky

0

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

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

2) В инспекторе атрибута tableView установите Selection to singleton. Это решило мою проблему

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

+0

i обновил вопрос – fabersky

+0

okay сделать это: установить точку останова на didselectrowatindexpath. Проверьте, вызван ли метод вызовом или нет. –

+0

Проблема заключается в том, что если didselectrowatindexpath не вызывается, значение _selectedrow не меняется, и поэтому вы выбираете не то, что выделяете –

1

Комплект Код:

- (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; 
} 

Вы выберите цвет выбор для сенсорного набора цветов. enter image description here

Смежные вопросы