在 SwiftUI 应用程序中放置音频播放代码的位置
Where to place code for audio playback in a SwiftUI app
在基于 SwiftUI 的应用程序中放置音频播放代码的最佳位置在哪里,即没有 UIViewController classes?我要播放的声音是由一个视图发起的,所以我想把它放到相应的视图模型中class。但作为一个模型 class 是关于数据的,我认为应该有更好的选择。最好的架构是什么?
正确,视图不应该处理数据。 SwiftUI 强制执行此逻辑。
您可以创建一个播放器 class 来播放音频。并将其添加为 EnvironmentObject
,因此您可以使用 View
中的按钮控制它。然后你可以做一些甜蜜的事情,比如绑定你的播放按钮以显示不同的图像,具体取决于玩家是否正在......播放:)
更新
Xcode 11 beta 4 的代码已更新(willChange
而不是 didChange
)
struct PlayerView : View {
@EnvironmentObject private var player: Player
var body: some View {
Button(action: {
self.player.pauseOrPlay()
}) {
Image(systemName: player.isPlaying ? "pause.circle.fill" : "play.circle.fill").font(.title).frame(minWidth: 44, minHeight: 44)
}
}
}
class Player: BindableObject {
let willChange = PassthroughSubject<Player, Never>()
var isPlaying: Bool = false {
willSet {
willChange.send(self)
}
}
func pauseOrPlay() {
// Code that toggles the audio on and off
}
}
虽然 Davide 的解决方案有效,但我最终使用单例模式来全局访问我的声音播放器对象,并且实际上将声音的触发从视图移回到模型 class。
看起来像这样:
class Player {
static let shared = AudioPlayer()
func pauseOrPlay() {
// Code that toggles the audio on and off
}
}
我现在可以从任何地方调用它了:
Player.shared.pauseOrPlay()
在基于 SwiftUI 的应用程序中放置音频播放代码的最佳位置在哪里,即没有 UIViewController classes?我要播放的声音是由一个视图发起的,所以我想把它放到相应的视图模型中class。但作为一个模型 class 是关于数据的,我认为应该有更好的选择。最好的架构是什么?
正确,视图不应该处理数据。 SwiftUI 强制执行此逻辑。
您可以创建一个播放器 class 来播放音频。并将其添加为 EnvironmentObject
,因此您可以使用 View
中的按钮控制它。然后你可以做一些甜蜜的事情,比如绑定你的播放按钮以显示不同的图像,具体取决于玩家是否正在......播放:)
更新
Xcode 11 beta 4 的代码已更新(willChange
而不是 didChange
)
struct PlayerView : View {
@EnvironmentObject private var player: Player
var body: some View {
Button(action: {
self.player.pauseOrPlay()
}) {
Image(systemName: player.isPlaying ? "pause.circle.fill" : "play.circle.fill").font(.title).frame(minWidth: 44, minHeight: 44)
}
}
}
class Player: BindableObject {
let willChange = PassthroughSubject<Player, Never>()
var isPlaying: Bool = false {
willSet {
willChange.send(self)
}
}
func pauseOrPlay() {
// Code that toggles the audio on and off
}
}
虽然 Davide 的解决方案有效,但我最终使用单例模式来全局访问我的声音播放器对象,并且实际上将声音的触发从视图移回到模型 class。
看起来像这样:
class Player {
static let shared = AudioPlayer()
func pauseOrPlay() {
// Code that toggles the audio on and off
}
}
我现在可以从任何地方调用它了:
Player.shared.pauseOrPlay()