Ios 具有快捷界面的播放/停止按钮
我正在开发一个可以播放列表中显示的音频文件的应用程序 音频文件1Ios 具有快捷界面的播放/停止按钮,ios,swift,audio,swiftui,Ios,Swift,Audio,Swiftui,我正在开发一个可以播放列表中显示的音频文件的应用程序 音频文件1 音频文件2 … 音频文件10 我有以下代码的音频工作 var audioPlayer: AVAudioPlayer? func playSound1() { let path = Bundle.main.path(forResource: "audiofile1.mp3", ofType:nil)! let url = URL(fileURLWithPath: path) do {
音频文件2
…
音频文件10 我有以下代码的音频工作
var audioPlayer: AVAudioPlayer?
func playSound1() {
let path = Bundle.main.path(forResource: "audiofile1.mp3", ofType:nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.play()
} catch {
print("Could not find file")
}
}
struct ContentView: View {
var body: some View {
Button(action:{ playSound1()}) {
Text("Audio File 1") }
}
}
我正在寻找解决当音频文件1被第二次点击时,它将停止播放音频文件1。另外,如果正在播放音频文件1,并且轻触音频文件2,则停止播放音频文件1并播放音频文件2。我希望这会发生在所有10个音频文件上。我建议如下:
class AudioModel: ObservableObject {
var audioPlayer: AVAudioPlayer?
@Published var current: String = ""
var audioFiles = ["audiofile1.mp3", "audiofile2.mp3", "audiofile3.mp3"]
func playSound() {
let path = Bundle.main.path(forResource: self.current, ofType:nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.play()
} catch {
print("Could not find file")
}
}
func stopSound() {
// Stop AVAudioPlayer
// audioPlayer.stop() ???
}
}
struct ContentView: View {
@ObservedObject var audioModel = AudioModel()
var body: some View {
VStack {
ForEach(self.audioModel.audioFiles, id: \.self) { item in
Button(action:{
self.audioModel.current = item
}) {
Text(item)
}
}
}
}.onReceive(self.audioModel.$current) {_ in
self.audioModel.stopSound()
self.audioModel.playSound()
}
}
它还没有完成,因为我无法测试它,但我希望这有助于进一步的调查
@Published
类似于@State
,另外还创建了一个so,每当它被更新时,就会进行onReceive()
调用。这是通过使用@ObservedObject
装饰器“观察”对象实现的,装饰器只能应用于符合ObservedObject