【发布时间】:2018-03-03 05:47:49
【问题描述】:
我正在构建一个包含多个视图控制器的应用程序。我需要控制所有音乐,所以我创建了一个专门的音乐类,我用它来设置/播放/停止/暂停。
我已经录制了音频问题和答案,我需要能够播放 question 和 answer mp3 文件。
所以我相信这里有几种方法来完成这个委托和协议,使用 func audioPlayerDidFinishPlaying 和使用闭包。据我所知,闭包是我想要实现的最佳选择。
我在 MakeMusic 课上的出发点是:
class MakeMusicClass : NSObject, AVAudioPlayerDelegate {
static let shared = MakeMusicClass()
var audioPlayer = AVAudioPlayer()
override init() { }
func setup(Selection: String) {
do {
audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: Selection, ofType: "mp3")!))
audioPlayer.prepareToPlay()
audioPlayer.delegate=self
} catch {
print (error)
}
}
func play() {
audioPlayer.play()
}
我的调用文件是:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
MakeMusicClass.shared.setup(Selection: "Question11")
MakeMusicClass.shared.play()
MakeMusicClass.shared.setup(Selection: "Answer11")
MakeMusicClass.shared.play()
为了让它工作,我知道我需要为被调用的类添加一个闭包:
func play() {
var closure = { in
audioPlayer.play()
}
}
我需要更新我需要调用函数的位置,例如:
override func viewDidLoad() {
super.viewDidLoad()
MakeMusicClass.shared.setup(Selection: "Question11")
MakeMusicClass.shared.play() {
MakeMusicClass.shared.setup(Selection: "Answer11")
MakeMusicClass.shared.play()
}
我花了很长时间试图解决这个问题,但我很挣扎。我的代码显然不起作用,因为我缺少一些基本的东西。我尝试过传递 void 和参数,但我不明白应该传递哪些参数。我最接近的是使用 makemusic 类中的 audioPlayerDidFinishPlaying 触发下一个音频文件,但我不知道这是理想的。
【问题讨论】: