当SwiftUI Widget的相对文本字段计数器为零时停止?

yruzcnhs  于 12个月前  发布在  Swift
关注(0)|答案(3)|浏览(142)

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

Text(endDate, style: .relative)

字符串
这很好,但是作为它的相对值,一旦它达到零,它将继续计数,因为endDate变成了过去。
有没有一种方法可以在文本达到零时终止文本?或者我必须用计时器重建这个功能?
所有我需要做的是倒计时从开始日期和结束日期,然后无效的文本字段或显示一条消息。

ax6ht2ek

ax6ht2ek1#

这里是如何创建一个倒计时,当时间结束时显示一些其他文本。
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")
        }
    }
}

xggvc2p6

xggvc2p62#

从iOS 16开始,现在可以通过将Text的'countsDown'参数设置为true来停止在0。
https://developer.apple.com/documentation/swiftui/text/init(timerinterval:pausetime:countsdown:showshours:)

w46czmvw

w46czmvw3#

我认为你必须在时间为零时安排一个小部件更新,并有条件在小于零时隐藏它。

相关问题