问题描述
我正在尝试使用 SwiftUI
创建一个类似于 Apple Music 的音乐播放器应用程序。
struct MiniPlayer: View {
let mediaItem : MPMediaItem
@State private var audioPlayer : AudioPlayer = AudioPlayer()
@State private var errorString : String?
@State private var showAlert : Bool = false
@State private var isPlaying : Bool = true
var body: some View {
ZStack {
vstack(alignment: .leading,spacing: 3){
HStack(spacing: 10){
SongsListingRow(mediaItem: mediaItem)
Spacer()
Button(action: {
isPlaying.toggle()
isPlaying ? audioPlayer.play() : audioPlayer.pause()
},label: {
Image(systemName: isPlaying ? "pause.fill" : "play.fill")
.foregroundColor(Color.black)
})
}
.padding(.horizontal,10)
ProgressView(value: 0.5)
}
.alert(isPresented: $showAlert,content: {
Alert(title: Text("Alert"),message: Text(errorString ?? "Something went wrong"),dismissButton: .default(Text("Okay")))
})
}
.onAppear{
reconfigurePlayer(mediaItem)
}
.onChange(of: mediaItem) { value in
reconfigurePlayer(value)
}
.ondisappear{
// audioPlayer.clean()
}
}
private func reconfigurePlayer(_ mediaItem : MPMediaItem){
if let url = mediaItem.assetURL{
errorString = self.audioPlayer.configure(url: url)
showAlert = errorString != nil
}else{
showAlert = true
}
}
}
还有 AudioPlayer
类:
class AudioPlayer{
private var audioPlayer : AVAudioPlayer?
func configure(url : URL) -> String?{
do{
try AVAudioSession.sharedInstance().setCategory(.playback)
self.audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.preparetoPlay()
audioPlayer?.volume = 0.3
self.play()
return nil
}catch{
return error.localizedDescription
}
}
...
}
以及显示 MiniPlayer
的列表:
struct SongsListing: View {
...
var body: some View {
vstack(spacing: 0) {
List{
TextField("Type your search",text: $searchText)
.textFieldStyle(RoundedBorderTextFieldStyle())
ForEach(songs,id: \.persistentID){ mediaItem in
Button(action: {
self.selectedItem = mediaItem
},label: {
SongsListingRow(mediaItem: mediaItem)
})
}
}
.navigationTitle("Songs")
if selectedItem != nil{
ZStack{
Color.white
.shadow(radius: 2.0)
MiniPlayer(mediaItem: selectedItem!)
}
.frame(height: 60.0)
}
}
}
}
所以流程是屏幕 A > SongsListing
。点按行项目会在屏幕底部显示 MiniPlayer
。
我的问题是:
当我从 SongsListing 返回到屏幕 A 时,AVAudioPlayer
不会自行停止播放。不应该从视图控制器中弹出来取消实例化 AudioPlayer
类并扩展 AVAudioPlayer
吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)