【发布时间】:2021-04-22 18:15:32
【问题描述】:
我有一个定义为 Music.swift 的类,编码如下:
import Foundation
import AVFoundation
class Music {
var isPlaying: Bool = false
public var backgrndSound = AVAudioPlayer()
func isMusicPlaying() -> Bool {
isPlaying = UserDefaults.standard.bool(forKey: "isPlaying")
return isPlaying
}
func StartPlaying() {
let path = Bundle.main.path(forResource: "Music.mp3", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
self.backgrndSound = try AVAudioPlayer(contentsOf: url)
self.backgrndSound.numberOfLoops = -1
self.backgrndSound.play()
UserDefaults.standard.setValue(true, forKey: "isPlaying")
} catch {
// couldn't load file :(
}
}
func StopPlaying() {
self.backgrndSound.pause()
self.backgrndSound.stop()
}
}
首次加载应用时,音乐会通过调用 StartPlaying() 自动开始。这工作得很好。之后我有一个设置菜单,其中有一个音乐播放开关:
import UIKit
import AVFoundation
class SettingsViewController: UIViewController {
@IBOutlet weak var swMusic: UISwitch!
var myMusic = Music()
override func viewDidLoad() {
super.viewDidLoad()
swMusic.isOn = UserDefaults.standard.bool(forKey: "isPlaying")
}
@IBAction func musicSwitch(_ sender: Any) {
if swMusic.isOn == true {
// turn on music
myMusic.StartPlaying()
} else {
myMusic.StopPlaying()
}
}
}
当我点击开关时,它会触发 StopPlaying(),但尽管点击了,背景中的音乐仍会继续播放。
我不确定为什么会这样,除非 AV 对象无法从原始创建中访问,因此无法正确停止它;但到目前为止,我也无法弄清楚。
任何帮助或建议将不胜感激。
【问题讨论】:
标签: ios swift avfoundation avaudioplayer