我的应用程序的主要视图是歌曲列表。
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
List (fileURLs, id: \.path) { song in
NavigationLink(destination: PlayView(songURL: song)) {
SongRow(songURL: song)
}
}
.padding()
.navigationBarTitle(Text("Songs"))
.navigationBarItems(trailing: addButton)
}
}
}
您点击一首歌曲,它会导航到PlayView,该实例会实例化音频播放器:
import SwiftUI
import AVKit
struct PlayView: View {
var songURL: URL
@State var player : AVAudioPlayer!
var body: some View {
VStack {
Button(action: {
self.playPause()
}) {
Text("Play/Pause")
}
}.onAppear {
self.player = try! AVAudioPlayer(contentsOf: self.songURL)
self.playPause()
}
}
func playPause() {
if self.player.isPlaying {
self.player.pause()
} else {
self.player.play()
}
}
}
问题是,当我导航到另一首歌曲的PlayView时,它会在第一首歌曲顶部播放音频(即,两者同时播放)。当第二首歌播放时,我应该如何杀死第一首歌?
在我的项目中,我在应用程序中到处都只使用一个final class
实例。我认为您遇到的问题是,您正在子视图(AVPlayer
)中创建许多PlayView
实例,但只能控制其中一个。这是我的解决方案的示例: