SwiftUI 的播放/停止按钮

Posted

技术标签:

【中文标题】SwiftUI 的播放/停止按钮【英文标题】:Play/Stop button with SwiftUI 【发布时间】: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 个音频文件上。

【问题讨论】:

【参考方案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 的类

【讨论】:

以上是关于SwiftUI 的播放/停止按钮的主要内容,如果未能解决你的问题,请参考以下文章

当我们在文本和图像之间切换按钮内容时,如何停止 SwiftUI 更改固定填充?

如何在 swiftUI 中播放来自 http 数据流的音频?

如何在 SwiftUI 中一键连续播放两种声音

如何在 SwiftUI 中暂停动画?

如何在 SwiftUI 中停止 Animation().repeatForever

iOS SwiftUI 视频自动播放