2014-11-23 85 views
5

我正在用Swift制作音板。它工作得很好,但我试图阻止检查AVAudioPlayer实例是否正在播放,如果是则停止播放。声音被列在一个tableview中,它从我存储我的Sound类的数组中获取数据(它有2个变量,标题和声音的URL)。快速检查AVAudioPlayer是否正在播放崩溃

我有我的AVAudioPlayer和AVAudioSession以及我的声音阵列上我的ViewController类:

var session = AVAudioSession.sharedInstance() 
var audioPlayer = AVAudioPlayer() 
var sounds: [Sound] = [] 

,我实现了音频播放,当应用程序用户选择一排这样的:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
      if audioPlayer.playing { 

       audioPlayer.stop() 
      } else { 
      var sound = self.sounds[indexPath.row] 

      var baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String 
      var pathComponents = [baseString, sound.url] 
      var audioNSURL = NSURL.fileURLWithPathComponents(pathComponents) 

      self.audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil) 
      self.audioPlayer.play() 

     } 
      tableView.deselectRowAtIndexPath(indexPath, animated: true) 

    } 

但是当我点击应用程序崩溃行和所有我得到的是“(LLDB)”

你有任何想法发生了什么事?还是我这样做完全错了?

预先感谢您

回答

4

我想通了,所以我与社区共享:

我也不得不宣布对我的ViewController类声音NSURL属性:

var session = AVAudioSession.sharedInstance() 
var audioPlayer = AVAudioPlayer() 
var audioNSURL = NSURL() 

也准备我的音频播放器ViewDidLoad功能: (我不得不使用示例声音来初始化AV AudioPlayer)

let samplePath = NSBundle.mainBundle().pathForResource("sample", ofType: "mp4") 
audioNSURL = NSURL.fileURLWithPath(samplePath!)! 
audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil) 
audioPlayer.prepareToPlay() 

然后,在didSelectRowAtIndexPath方法的方法,我检查AVAudioPlayer实例是否正在播放并且如果它的演奏由被窃听的细胞反射的声音。如果是的话,停止audioPlayer,如果没有则播放其他声音(audioPlayer停止并播放其他声音)

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     var sound = self.sounds[indexPath.row] 
     var baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String 
     var pathComponents = [baseString, sound.url] 

     var rowSoundURL = NSURL.fileURLWithPathComponents(pathComponents)! 


     if audioPlayer.playing && rowSoundURL == audioNSURL { 

      audioPlayer.stop() 

     } else { 

      audioNSURL = rowSoundURL 

      self.audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil) 
      self.audioPlayer.play() 

     } 

      tableView.deselectRowAtIndexPath(indexPath, animated: true) 

    } 

要知道,如果你还记录在您的应用程序的声音,您必须设置会话类别设置为AVAUdioSessionCategoryPlayback,或者通过设备的小型扬声器听到声音。所以,在viewWillAppear功能:

session.setCategory(AVAudioSessionCategoryPlayback, error: nil)