首页 > 解决方案 > 当达到零时停止 SwiftUI 小部件的相对文本字段计数器?

问题描述

我正在创建一个小部件,它有一个从日期开始倒计时的文本字段,如下所示:

Text(endDate, style: .relative)

这很好用,但是作为它的相对值,一旦它达到零,它将继续重新计数,因为 endDate 成为过去。

有没有办法在文本达到零时终止文本?还是我必须使用计时器重建此功能?

我需要做的就是从开始日期倒计时到结束日期,然后使文本字段无效或显示一条消息。

标签: iosswiftswiftuiwidgetkit

解决方案


这是创建倒计时以及时间结束时显示其他文本的方法。

  1. 创建一个endDate可选的条目 - 如果nil它意味着倒计时结束:
struct SimpleEntry: TimelineEntry {
    let date: Date
    var endDate: Date?
}
  1. 在您的提供者中创建两个条目 - 一个用于倒计时时间,一个用于倒计时结束时:
struct SimpleProvider: TimelineProvider {
    ...

    func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) {
        let currentDate = Date()
        let endDate = Calendar.current.date(byAdding: .second, value: 15, to: currentDate)!

        let entries = [
            SimpleEntry(date: currentDate, endDate: endDate),
            SimpleEntry(date: endDate),
        ]

        let timeline = Timeline(entries: entries, policy: .never)
        completion(timeline)
    }
}
  1. 在您的视图中使用它:
struct WidgetEntryView: View {
    var entry: Provider.Entry

    var body: some View {
        if let endDate = entry.endDate {
            Text(endDate, style: .relative)
        } else {
            Text("Timer finished")
        }
    }
}

推荐阅读