0
genannt wird

Ich habe eine NSArray und eine Tableview mit einigen Tasten, dessen Titel ist die Zeichenfolge in dem Array an der aktuellen indexPath ReiheindexPath.row kehrt letzte sichtbare Zelle und DidSelectRowAtIndexPath nicht

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

} 

Button-Titel sind gut gezeigt.

Jetzt habe ich einige mp3-Dateien, deren Namen die gleichen wie die Zeichenfolgen im Array sind, und ich möchte die Datei entsprechend der ausgewählten Zelle wiedergeben.

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

Was hier passiert ist, dass die wiedergegebene Datei immer die ist, die der letzten sichtbaren Zelle in der Tabelle entspricht.

Ich habe auch

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

aber Wenn ich versuche, hier zu drucken _selectedRow, erscheint nichts im Protokoll.

Wenn ich auf eine Zelle in der Tabelle klicke, scheint sie nicht ausgewählt zu sein (sie ist nicht grau gefärbt).

dataSource und Delegate sind auch gut mit der Tabellenansicht verbunden.

UPDATE

fand ich heraus, dass, wenn ich auf den Button klicken, es ist wie ich nicht auf der ausgewählten Zeile klicken bin. Wenn ich auf die Zelle (außerhalb der Schaltfläche) klicke, ist indexPath.row korrekt.

+0

Versuchen Sie folgendes: Satz myGestureRecognizer.cancelsTouchInView auf false –

+1

warum Sie hinzufügen _selectedRow = indexpath.row; in ZelleForRowAtIndex? –

+0

Sind Sie sicher, dass 'didSelectRowAtIndexPath' überhaupt aufgerufen wird, wenn Sie die Zelle auswählen? Es wird möglicherweise gar nicht ausgewählt, was Ihre '_selectedRow' als letzte Zelle zurücklässt, die geladen wurde (unten, wenn Sie nach unten scrollen, oben, wenn Sie nach oben scrollen ...). – Putz1103

Antwort

2

Entfernen Sie die folgende Zeile von der cellForRowAtIndexPath-Methode.

_selectedRow = indexpath.row; 

Sie setzen den _selectedRow Wert jedes Mal, wenn die cellForRowAtIndexPath genannt wird, das heißt, wenn jede Zelle gezogen wird, und erklärt, warum der Wert der letzten Zelle aufgenommen wird.

+0

ja, ich habe gerade versucht. Aber das Problem hier ist, dass wenn ich auf den Knopf in der Zelle klicke, ich nicht wirklich auf die Zelle klicke, so dass der selectedRow nicht aktualisiert wird. Wenn ich auf die Zelle klicke (außerhalb des Buttons), ist es das. – fabersky

+0

Brauchen Sie wirklich einen Knopf? Es scheint, als ob die Schaltfläche das Berührungsereignis verbraucht. Können Sie versuchen, button.userInteractionEnabled = NO; auf der Schaltfläche in der Zelle? –

+0

Ich brauche es, um das Audio zu spielen – fabersky

0

Versuchen Sie diese:

1) gesetzt myGestureRecognizer.cancelsTouchInView auf false ... vielleicht sind deine Berührungen in Quere. (Es ist ein häufiges Problem, wenn Sie Gestenerkenner haben können)

2) Setzen Sie im Inspektor Ihres TableView-Attributs die Auswahl auf Singleton. Das löste mein Problem

3) setze das: [tableView setAllowsSelection: YES];

+0

Ich aktualisierte die Frage – fabersky

+0

okay, tun Sie dies: Stellen Sie einen Haltepunkt auf Didselectrowatindexpath. Überprüfen Sie, ob die Methode aufgerufen wird oder nicht –

+0

Das Problem ist, wenn didselectrowatindexpath nicht aufgerufen wird, dann ändert sich der Wert von _selectedrow nicht, und was Sie auswählen, ist nicht was sie markieren –

1

Set Code:

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

Sie sind wählen Auswahlfarbe für Touch-Farbsatz. enter image description here