2016-08-05 22 views
0

Ich habe eine Tabellenansicht und jede Zelle hat eine Play-Taste. Die Wiedergabetaste ist eine UIButton, die zwischen einem Wiedergabe- und einem Pause-Bild wechselt. Wenn die Wiedergabe/Pause-Taste gedrückt wird, spielt/pausiert AVAudioPlayer die Audiodatei, die der Zelle zugeordnet ist. Ab sofort lassen sich die Bilder perfekt und synchron zum Audioplayer umschalten. Wenn der Ton jedoch abgespielt wird, möchte ich, dass das Bild in den Standardzustand zurückkehrt - das Bild der Wiedergabetaste.Toggle tableview cell image wenn AVAudioPlayer abgespielt wird

//View controller containing tableview 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = self.audioTable.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! AudioCell 

    let track = self.sectionTracks[indexPath.row] 

    cell.playButton.addTarget(self, action: #selector(HomeController.playPausePressed(_:)), forControlEvents: UIControlEvents.TouchUpInside) 

    var playButtonImage = UIImage(named: "TableViewCellPlayButton84.jpg") 
    var pauseButtonImage = UIImage(named: "TableViewCellPauseButton84.jpg") 
    playButtonImage = playButtonImage?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) 
    pauseButtonImage = pauseButtonImage?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) 

    cell.playButton.setImage(playButtonImage, forState: UIControlState.Normal) 
    cell.playButton.setImage(pauseButtonImage, forState: UIControlState.Selected) 
    cell.playButton.selected = false 

    return cell 
} 

func playPausePressed(sender:UIButton) { 

    let pointInTable: CGPoint = sender.convertPoint(sender.bounds.origin, toView: self.audioTable) 
    let cellIndexPath = self.audioTable.indexPathForRowAtPoint(pointInTable) 
    let track = self.sectionTracks[cellIndexPath!.row] 

    //Handle AVAudioPlayer play/pause functionality 
} 

//Custom tableview cell file 
@IBAction func playPausePressed(sender: UIButton!) { 

    if (sender.selected) 
    { 
     sender.selected = false 
    } 
    else{ 
     sender.selected = true 
    } 
} 

Antwort

0

Sie können sich als Delegierter des AVAudioPlayer anmelden und dann prüfen, wann der Ton vollständig ist. Können Sie mehr als eine Datei gleichzeitig oder mehrfach abspielen? Wenn Sie mehrere wiedergeben können, müssen Sie alle abgespielten Audiodateien verfolgen und dann die Schaltfläche in der Zeile umschalten, je nachdem wann der Delegat ausgelöst wurde und mit welcher Zeile der Player verbunden war. Wenn Sie nur einen wiedergeben können, speichern Sie die Zeile, wenn der Benutzer mit der Wiedergabe des Audiomaterials beginnt, und wenn der Ton endet, können Sie den Schalter für diese Zeile aktivieren.

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioPlayerDelegateProtocolReference/

private var xoAssociationKey: UInt8 = 0 

extension AVAudioPlayer { 
    var name: String! { 
     get { 
      return objc_getAssociatedObject(self, &xoAssociationKey) as? String 
     } 
     set(newValue) { 
      objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
     } 
    } 
} 

Es könnte hilfreich sein, eine Erweiterung, wie oben, um einen Namen für die AVAudioPlayer Instanz zu speichern. Sie können dann den Namen des wiedergegebenen Audiomaterials und den Indexpfad der Zelle in einem änderbaren Wörterbuch nachverfolgen. Wenn Sie den Aufruf zurück an die Delegat-Funktion optional func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) erhalten, können Sie im Verzeichnis nach der player.name suchen, die Ihnen den Indexpfad zur Zelle dieser Schaltfläche zurückgibt. Holen Sie die Zelle aus der Tabellenansicht und schalten Sie dann den ausgewählten Zustand der Schaltflächen um.

EDIT

Für eine einzelne Zelle zu einem Zeitpunkt, zu spielen Sie können eine Variable Sie Klasse als var playingAudioIndexPath:NSIndexPath?

hinzufügen Wenn das Audio dies dem Zellenindex Pfad für die Schaltfläche Set beginnt zu spielen, das war geklickt.

Dann auf die Wiedergabe beenden Ereignis nur die Zelle greifen und drücken Sie dann die Taste

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, 
          successfully flag: Bool) { 
    guard let indexPath = self.playingAudioIndexPath, 
     cell = self.table.cellForRowAtIndexPath(indexPath) as? AudioCell else { 
     return; 
    } 

    cell.playButton.selected = false 
    self.playingAudioIndexPath = nil 
} 

DMCApps

+0

Dank. Wenn die Audiodatei für eine Zelle wiedergegeben wird und eine andere Datei für die Wiedergabe ausgewählt wird, wird die vorherige Datei nicht mehr abgespielt. Ich habe 'audioPlayerDidFinishPlaying' vorher verwendet, aber um ehrlich zu sein, mein Problem ist der Zugriff auf die Knopfeigenschaften der Zellen außerhalb von' cellForRowAtIndexPath'. Ich werde versuchen, was Sie vorschlagen. – Brosef

+0

Sie sollten einen 'var playingAudioIndexPath: NSIndexPath' in der Datei speichern können. Sobald der Audio-Start beginnt, setzen Sie diesen Wert auf die Zelle, die den Indexpfad spielt. Wenn 'audioPlayerDidFinishPlaying' aufgerufen wird, dann rufe einfach' if let cell = self.table.cellForRowAtIndexPath (self.playingAudioIndexPath) als? AudioCell {// Perform-Schalter hier an der Zelle umschalten} 'und den Wert auf Null setzen – DMCApps

+0

ein Codebeispiel für Einzelzellen-Wiedergabe hinzugefügt – DMCApps