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 数据流的音频?