只显示Swift/SwiftUI中Date对象的时间



我一直致力于显示音频持续时间与结束时间。一个优秀的Stack Overflow开发者提出了这个解决方案。

因此,我在我的视图中添加了这个:

struct ContentView: View {
@ObservedObject var viewModel = MyViewModel() //<- here
var body: some View {
VStack {

Text(viewModel.endTime) //<- here

}
}
}

这是我的viewModel中的代码:

class MyViewModel: ObservableObject {
@Published var endDate: Date? 
var endTime: String{
endDate == nil ? "":endDate!.description 
}
func play(){
let path = Bundle.main.path(forResource: "song", ofType:"mp3")!
let url = URL(fileURLWithPath: path)
do {
player = try AVAudioPlayer(contentsOf: url)

endDate = Date() + player.duration
if player.isPlaying{

player.pause()

}
else{
player.play()

}
isPlaying = player.isPlaying
}catch{print("error")}

但是我得到了错误的时间(不是系统时间),但是有正确的日期。我想只显示正确的时间而不显示日期。

iOS 14 +,文本有一个名为style的属性,用于显示日期。

文本。DateStyle

用于显示日期的预定义样式。

init(Date, style: Text.DateStyle)

创建一个实例,该实例使用特定样式显示本地化的日期和时间。https://developer.apple.com

不需要使用DateFormatter。也许用Text()+time作为样式就足够了。

Text(Date(), style: .time) 

在你的例子中:

Text(viewModel.endTime, style: .time)

要显示格式化日期,您可能需要使用DateFormatter:

let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none

let date = Date(timeIntervalSinceReferenceDate: 118800)

// US English Locale (en_US)
dateFormatter.locale = Locale(identifier: "en_US")
print(dateFormatter.string(from: date)) // Jan 2, 2001

来源:https://developer.apple.com/documentation/foundation/dateformatter

(注意,创建DateFormatter是一个非常昂贵的操作,所以在频繁创建它们时要小心)

在视图模型中也有一些逻辑错误。下面是如何处理这个问题的一个示例:

struct ContentView : View {
@ObservedObject private var vm = MyViewModel()

var body: some View {
Button(action:{
vm.play()
} ) {
Text(vm.isPlaying ? "Stop" : "Play")
}
Text(vm.endTime)
}
}
class MyViewModel: ObservableObject {
@Published var endDate: Date?
@Published var isPlaying = false

var player = AVAudioPlayer()
var dateFormatter = DateFormatter()

var endTime: String{
guard let endDate = endDate else {
return ""
}
dateFormatter.dateStyle = .none
dateFormatter.timeStyle = .medium
return dateFormatter.string(from: endDate)
}
func play(){
do{
if player.isPlaying {
player.pause()
} else {
let path = Bundle.main.path(forResource: "All Of Me Final Mix", ofType:"mp3")!
let url = URL(fileURLWithPath: path)
player = try AVAudioPlayer(contentsOf: url)
endDate = Date() + player.duration - player.currentTime
player.play()
}
isPlaying = player.isPlaying
} catch {
print("error: (error)")
}
}
}

最新更新