swift - 在 SwiftUI 应用程序中放置音频播放代码的位置

标签 swift audio avfoundation avaudioplayer swiftui

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

2年前关闭。




Improve this question




在基于 SwiftUI 的应用程序中放置音频播放代码的最佳位置在哪里,即没有 UIViewController 类?我要播放的声音是由一个 View 发起的,所以我想把它放到对应的 View 模型类中。但由于模型类是关于数据的,我认为应该有更好的选择。最好的架构是什么?

最佳答案

正确, View 不应该处理数据。 SwiftUI 强制执行此逻辑。

您可以创建一个播放器类来处理播放音频。并将其添加为 EnvironmentObject ,因此您可以使用 View 中的按钮来控制它.然后,您可以做一些甜蜜的事情,例如绑定(bind)您的播放按钮以根据播放器是否正在播放不同的图像:)

更新
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
    }
}

关于swift - 在 SwiftUI 应用程序中放置音频播放代码的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57068891/

相关文章:

audio - 解码和播放 aac-eld,常规静态和怪异

ios - AVAsset 维度 : track's naturalSize is not the size off the exported video

swift - 核心数据一对一关系

ios - 如何在 textview 中输入后关闭 tableView 中的键盘

ios - 如何在点击另一个单元格后操作 UITableViewCell? - swift

javascript - ScriptProcessorNode 跳过

javascript - 如何从 audio.currentTime 中获取增量?

ios - 如何在 Swift 中将一个 View 复制到另一个 View

iphone - AVPlayer和本地文件

macos - Mac OS X 10.8 上的 AVCaptureScreen