SwiftUI:AAudioPlayer不会停止



我有一个AVAudioPlayer,其中包含可观察对象中的一些关键数据:

class Player: ObservableObject {
var data: Data?
var player: AVAudioPlayer?

init() {}

func play(audioData: Data) {
self.stop()

// Set the data for the player
self.data = audioData

do {
self.player = try AVAudioPlayer(data: audioData)
} catch {
debugPrint("error")
}

// Play with the audio if it exists
player?.prepareToPlay()
player?.play()
}

func pause() {
player?.pause()
}

func stop() {
player?.stop()
player?.currentTime = 0
}
}

stop()函数不称为player?.stop,因为未知原因,AVAudioPlayer为零(即使它正在播放音频(。

在视图中,当我播放它时,我想mutate包含数据的struct。视图如下:

struct MainView: View {
@ObservedObject var player = Player()
var body: some View { 
ForEach(audioDataList) { audioData in 
SubView(audioData: audioData).environmentObject(player)
}
}
} 
struct SubView: View {
@EnvironmentObject var player: Player
var audioData: AudioData
var body: some View {
Text("Play or stop")
.onTapGesture {
player.play()
audioData.mutateAudioDataStruct()
}
} 
}

为什么我在呼叫player.play()时音频没有停止播放?我有stop()功能,如果AVAudioPlayer正在播放音频,它显然不是零。

如果你想突变SwiftUIView拥有的struct,它应该是一个@State变量——试图突变非@State变量最多不会编译(编译器应该告诉你你是Cannot use mutating member on immutable value: 'self' is immutable(,最坏的情况是(如果你找到了解决编译器错误的方法(,会导致意想不到的后果。

未来的读者,请参阅对原始问题的评论,以更详细地解释这个结论是如何得出的

最新更新