我正在建立一个睡眠定时器应用程序,它允许使用9种不同的声音来帮助你入睡。我需要的最后一件事就是能够在按下按钮时播放声音,并在再次按下时停止播放相同的声音。我试着这样做:如何使用单个按钮启动和停止音频?
@IBAction func heavyThunderBtnPressed(_ sender: UIButton) {
heavyThunderBtn.isSelected = true
toggleButton(button: sender, onImage: #imageLiteral(resourceName: "thunderstorm_selected"), offImage: #imageLiteral(resourceName: "thunderstorm_unselected"))
numberOfPresses += 1
if numberOfPresses % 2 == 0 || numberOfPresses == 1 && numberOfPresses != 2 {
do {
rainAudioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "thunder", ofType: "mp3")!))
rainAudioPlayer.prepareToPlay()
rainAudioPlayer.play()
}
catch {
print(error)
}
}
else {
rainAudioPlayer.stop()
}
}
但它可以让我按下按钮时,播放音频和按钮变为我选择显示的颜色它的上。然后当我再次按下时,音频重新开始并继续播放,然后当我再次按下它时,它停止播放,但按钮再次变为蓝色,表示它已开启。所以这就是我改变它的原因,但每次按按钮播放音频时都会发生崩溃。我得到的错误是 “EXC_BAD_ACCESS(代码= 1,地址= 0×48)”
import UIKit
import AVFoundation
class RainSoundsViewController: UIViewController {
var rainAudioPlayer = AVAudioPlayer()
var numberOfPresses = 0
var tappedAgain: Bool! = false
var heavyThunderOffImage = UIImage()
@IBOutlet weak var backgroundView: UIView!
@IBOutlet weak var heavyThunderBtn: UIButton!
@IBOutlet weak var lightRainBtn: UIButton!
@IBOutlet weak var rainOnRoofBtn: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
heavyThunderOffImage = #imageLiteral(resourceName: "thunderstorm_unselected")
heavyThunderBtn.isSelected = false
backgroundView.layer.cornerRadius = 10
backgroundView.layer.masksToBounds = true
}
@IBAction func dismissPopup(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
@IBAction func heavyThunderBtnPressed(_ sender: UIButton) {
heavyThunderBtn.isSelected = true
toggleButton(button: sender, onImage: #imageLiteral(resourceName: "thunderstorm_selected"), offImage: #imageLiteral(resourceName: "thunderstorm_unselected"))
numberOfPresses += 1
if rainAudioPlayer.isPlaying {
do {
rainAudioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "thunder", ofType: "mp3")!))
rainAudioPlayer.prepareToPlay()
rainAudioPlayer.play()
}
catch {
print(error)
}
}
else {
rainAudioPlayer.stop()
}
}
错误是什么? – Shades
第51行,如果rainAudioPlayer.isPlaying –
[检查AVAudioPlayer是否正在播放]可能的重复(https://stackoverflow.com/questions/30302640/check-if-avaudioplayer-is-playing) – Shades