Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有快捷界面的播放/停止按钮_Ios_Swift_Audio_Swiftui - Fatal编程技术网

Ios 具有快捷界面的播放/停止按钮

Ios 具有快捷界面的播放/停止按钮,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 {

我正在开发一个可以播放列表中显示的音频文件的应用程序

音频文件1
音频文件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