在 SwiftUI 中实时更新相对时间
Live update relative time in SwiftUI
在我的 SwiftUI 应用程序中,我按如下方式显示相对时间。
struct ContentView: View {
let date: Double = 1589014112
var body: some View {
Text(Date(timeIntervalSince1970: date).relativeTime())
}
}
extension Date {
func relativeTime(in locale: Locale = .current) -> String {
let formatter = RelativeDateTimeFormatter()
formatter.unitsStyle = .full
return formatter.localizedString(for: self, relativeTo: Date())
}
}
我从 API 中得到自 1970 年以来的时间间隔的两倍。我想在我的应用程序中显示相对时间。输出如下。
视图仅在我重新加载时更新,并且每过一秒都停留在“10 秒前”。如何实时更新?我想在当前日期 (Date()
) 更改时更改。
您可以使用 TimerPublisher 定期触发某些内容。
下面是一个简单的例子;
struct PlaygroundView: View {
let timer = Timer.publish(
every: 1, // second
on: .main,
in: .common
).autoconnect()
let date = Date()
@State var secondStr: String = ""
var body: some View {
Text(secondStr)
.onReceive(timer) { (_) in
self.secondStr = self.date.relativeTime()
}
}
}
extension Date {
func relativeTime(in locale: Locale = .current) -> String {
let formatter = RelativeDateTimeFormatter()
formatter.unitsStyle = .full
return formatter.localizedString(for: self, relativeTo: Date())
}
}
你可以观察到 secondStr
每秒都在变化,就像
1 秒前
2 秒前
等等..
您可以使用 SwiftUI Text 的 init(_:style:) 在没有计时器的情况下完成此操作。
let date: Double = 1589014112
var body: some View {
Text(Date(timeIntervalSince1970: date), style: .relative)
}
注意:可用的 style
对于大多数用例来说应该足够了,但它们有些受限。参见 Text.DateStyle。
在我的 SwiftUI 应用程序中,我按如下方式显示相对时间。
struct ContentView: View {
let date: Double = 1589014112
var body: some View {
Text(Date(timeIntervalSince1970: date).relativeTime())
}
}
extension Date {
func relativeTime(in locale: Locale = .current) -> String {
let formatter = RelativeDateTimeFormatter()
formatter.unitsStyle = .full
return formatter.localizedString(for: self, relativeTo: Date())
}
}
我从 API 中得到自 1970 年以来的时间间隔的两倍。我想在我的应用程序中显示相对时间。输出如下。
视图仅在我重新加载时更新,并且每过一秒都停留在“10 秒前”。如何实时更新?我想在当前日期 (Date()
) 更改时更改。
您可以使用 TimerPublisher 定期触发某些内容。
下面是一个简单的例子;
struct PlaygroundView: View {
let timer = Timer.publish(
every: 1, // second
on: .main,
in: .common
).autoconnect()
let date = Date()
@State var secondStr: String = ""
var body: some View {
Text(secondStr)
.onReceive(timer) { (_) in
self.secondStr = self.date.relativeTime()
}
}
}
extension Date {
func relativeTime(in locale: Locale = .current) -> String {
let formatter = RelativeDateTimeFormatter()
formatter.unitsStyle = .full
return formatter.localizedString(for: self, relativeTo: Date())
}
}
你可以观察到 secondStr
每秒都在变化,就像
1 秒前
2 秒前
等等..
您可以使用 SwiftUI Text 的 init(_:style:) 在没有计时器的情况下完成此操作。
let date: Double = 1589014112
var body: some View {
Text(Date(timeIntervalSince1970: date), style: .relative)
}
注意:可用的 style
对于大多数用例来说应该足够了,但它们有些受限。参见 Text.DateStyle。