在SwiftUI中实时更新相关时间

4
在我的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年以来的时间间隔,类型为double。我想在我的应用程序中显示相对时间。输出如下所示。

enter image description here

视图只有在我重新加载时才会更新,并且每秒钟都停留在“10秒前”。如何实时更新它?我想要在当前日期(Date())改变时进行更改。
2个回答

9
你可以使用 SwiftUI Text 的 init(_:style:) 方法来实现此功能,无需使用定时器。
let date: Double = 1589014112

var body: some View {
    Text(Date(timeIntervalSince1970: date), style: .relative)
}
可用性:iOS 14.0+、iPadOS 14.0+、macOS 11.0+、Mac Catalyst 14.0+、tvOS 14.0+、watchOS 7.0+。

注意:可用的style应该足够满足大多数使用情况,但它们有一定的限制。请参见Text.DateStyle


您可以提到DateStyle仅适用于iOS 14+,而计时器从iOS 13开始工作。 - imthath
1
@Imthath 我已经根据你的建议更新了答案。谢谢! - Alexander Sandberg

9
您可以使用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秒钟前
以此类推...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接