Swift – 停止avaudioplayer

我正在尝试将音板构建到应用程序中,并找到了一种使用标签来控制播放声音的有效方法。 但是我现在正在尝试集成一个可以与AVAudioPlayer上的.stop()方法一起使用的暂停按钮但是我的当前代码出错:

EXC_BAD_ACCESS

这就是我目前使用的,任何想法?

 import UIKit import AVFoundation let soundFilenames = ["sound","sound2","sound3"] var audioPlayers = [AVAudioPlayer]() class SecondViewController: UIViewController { var audioPlayer = AVAudioPlayer() override func viewDidLoad() { super.viewDidLoad() for sound in soundFilenames { do { let url = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(sound, ofType: "mp3")!) let audioPlayer = try AVAudioPlayer(contentsOfURL: url) audioPlayers.append(audioPlayer) } catch { //Catch error thrown audioPlayers.append(AVAudioPlayer()) } } } @IBAction func buttonPressed(sender: UIButton) { let audioPlayer = audioPlayers[sender.tag] audioPlayer.play() } @IBAction func stop(sender: UIButton) { audioPlayer.stop() } } 

停止function中的audioPlayer不是播放播放器。 您应该在buttonPressed函数中分配它。

 @IBAction func buttonPressed(sender: UIButton) { audioPlayer = audioPlayers[sender.tag] audioPlayer.play() } 

顺便说一句,您可以将audioPlayer标记为“?” 属性,初始化此控制器时效率更高。

 class SecondViewController: UIViewController { var audioPlayer: AVAudioPlayer? let enableMuiltPlayers = false .... @IBAction func buttonPressed(sender: UIButton) { if sender.tag < audioPlayers.count else { print("out of range") return } if enableMuiltPlayers { audioPlayers[sender.tag].play() } else { audioPlayer?.stop() //set the current playing player audioPlayer = audioPlayers[sender.tag] audioPlayer?.play() } } @IBAction func stop(sender: UIButton) { let wantToStopAll = false if enableMuiltPlayers && wantToStopAll { stopAll() } else { audioPlayer?.stop() } audioPlayer = nil } } 

停止所有:

 fun stopAll() { for player in audioPlayers { player.stop() } } 

您的代码可能有其他错误,但有一件事是肯定的:

您不应使用默认初始化程序AVAudioPlayer()实例化AVAudioPlayer

改变这一行:

  var audioPlayer = AVAudioPlayer() 

至:

  var playingAudioPlayer: AVAudioPlayer? 

并改变这一部分:

  } catch { //Catch error thrown audioPlayers.append(AVAudioPlayer()) } 

这样的事情:

  } catch { //Catch error thrown fatalError("Sound resource: \(sound) could not be found") } 

(后一部分对于解决这个问题非常重要。但是我发现在编辑之后它已经变成了郝的答案的一部分……)

start方法:

  @IBAction func start(sender: UIButton) { let audioPlayer = audioPlayers[sender.tag] audioPlayer.start() playingAudioPlayer = audioPlayer } 

并且应该stop

  @IBAction func start(sender: UIButton) { playingAudioPlayer?.stop() } 
 if audioPlayer != nil { if audioPlayer.playing { audioPlayer.stop() } }