2016-08-05 60 views
0

我有一个tableview,每个单元格都有一个播放按钮。播放按钮是在播放和暂停图像之间切换的UIButton。当播放/暂停按钮被按下时,AVAudioPlayer播放/暂停与该单元相关联的音频文件。截至目前,我的图像完美切换并与音频播放器同步。但是,当音频完成播放时,我希望图像切换回其默认状态 - 播放按钮图像。当AVAudioPlayer完成播放时切换tableview单元格图像

//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 
    } 
} 

回答

0

您可以订阅AVAudioPlayer的代理,然后检查音频何时完成。你可以一次或多次播放多个文件吗?如果您可以播放多个音乐,则必须跟踪所有播放的音频,然后根据代表何时被触发以及播放器与哪一行相关联来切换该行上的按钮。如果只能播放一个,那么当用户开始播放音频时只保存该行,并在音频结束时切换该行的按钮。

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) 
     } 
    } 
} 

这可能有助于提出延期如上的名字存储到AVAudioPlayer实例。然后,您可以跟踪正在播放的音频名称和单元格的可变字典中的索引路径。当你回到委托功能optional func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)时,你可以查看字典中的player.name,它会让你回到该按钮的单元格的索引路径。从表格视图中获取单元格,然后切换按钮选择状态。

编辑

对于单个细胞在同一时间玩,你可以一个变量来你的类添加为var playingAudioIndexPath:NSIndexPath?

当音频开始播放设置该为这是该按钮的小区索引路径点击。

然后在播放结束时只抓的单元格,切换按钮

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

感谢。如果一个单元的音频文件正在播放,而另一个文件被选中播放,则以前的文件将停止播放。我之前使用过'audioPlayerDidFinishPlaying',但坦率地说,我的问题是访问'cellForRowAtIndexPath'之外的单元格按钮属性。我试试你的建议。 – Brosef

+0

您应该能够在文件中存储'var playingAudioPath:NSIndexPath'。一旦音频开始将此值设置为播放索引路径的单元格。然后,当调用'audioPlayerDidFinishPlaying'时,只需调用'if let cell = self.table.cellForRowAtIndexPath(self.playingAudioIndexPath)as? AudioCell {//执行单元格切换按钮}'并将值设置为零在这里 – DMCApps

+0

增加了一些代码示例单细胞播放 – DMCApps

相关问题