SwiftUI 中的实时更新相对时间

Imt*_*ath 1 nsdateformatter ios swift 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())
    }
}
Run Code Online (Sandbox Code Playgroud)

我从 API 中获得了自 1970 年以来的时间间隔加倍。我想在我的应用中显示相对时间。输出如下。

在此处输入图片说明

视图仅在我重新加载时更新,并且每一秒都停留在“10 秒前”。如何实时更新?我想在当前日期 ( Date()) 更改时更改。

Ale*_*lex 10

您可以使用 SwiftUI Text 的init(_:style:)来完成此任务,而无需计时器。

let date: Double = 1589014112

var body: some View {
    Text(Date(timeIntervalSince1970: date), style: .relative)
}
Run Code Online (Sandbox Code Playgroud)

可用性: iOS 14.0+、iPadOS 14.0+、macOS 11.0+、Mac Catalyst 14.0+、tvOS 14.0+、watchOS 7.0+。

注意:可用的styles 对于大多数用例来说应该足够了,但它们有些有限。请参阅Text.DateStyle


Ene*_*man 5

您可以使用 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())
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以观察到secondStr每秒发生的变化,例如
1 秒前、
2 秒前
等等。