【问题标题】:Play/Stop button with SwiftUISwiftUI 的播放/停止按钮
【发布时间】:2019-10-16 15:32:41
【问题描述】:

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

音频文件 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 个音频文件上。

【问题讨论】:

    标签: ios swift audio swiftui


    【解决方案1】:

    我建议如下:

    
    
    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 并另外创建一个Publisher,因此无论何时更新,都会调用onReceive()。这是通过使用 @ObservedObject 装饰器“观察”对象来实现的,该装饰器只能应用于符合 ObservableObject 的类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      相关资源
      最近更新 更多