如何在swiftui中添加带有歌曲结束时间的当前日期?

问题描述

我想将当前时间 (Date()) 和 AVAudioPlayer 总时间歌曲时间 (play.duration) 加在一起以获得歌曲结束的时间?

func play(){
let path = Bundle.main.path(forResource: "song",ofType:"mp3")!
    let url = URL(fileURLWithPath: path)
    do{
        player = try AVAudioPlayer(contentsOf: url)
        
        let endDate = Date() + player.duration
        if player.isPlaying{
            
            player.pause()
            
        }
        else{
            player.play()
         }
        isPlaying = player.isPlaying
    }catch{print("error")}
}

这是我的看法

vstack {
         
         Text("I want to display the ending time here")

        }

解决方法

我们可以将 TimeInterval 添加到 Date

TimeInterval 值总是以秒为单位指定;它产生 10,000 年范围内的亚毫秒级精度。

    Date() + 60 //<- 1 Second 
    let endDate = Date() + avPlayer.duration
struct ContentView: View {
    @ObservedObject var viewModel = MyViewModel() //<- here
    
    var body: some View {
        VStack {
            
            Text(viewModel.endTime) //<- here
            
        }
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在您的视图模型中

class MyViewModel: ObservableObject {
    @Published var endDate: Date? //<- here
    
    var endTime: String{
    if endDate == nil {
        return ""
    }else {
        var dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "hh:mm"
        return dateFormatter.string(from: endDate)
    }
}

    func play(){
        let path = Bundle.main.path(forResource: "song",ofType:"mp3")!
        let url = URL(fileURLWithPath: path)
        do{
            player = try AVAudioPlayer(contentsOf: url) //<-here
            
            endDate = Date() + player.duration
            if player.isPlaying{
                
                player.pause()
                
            }
            else{
                player.play()
            }
            isPlaying = player.isPlaying
        }catch{print("error")}
    }
}