当达到零时停止 SwiftUI 小部件的相对文本字段计数器?

Posted

技术标签:

【中文标题】当达到零时停止 SwiftUI 小部件的相对文本字段计数器?【英文标题】:Stopping a SwiftUI Widget's relative textfield counter when hits zero? 【发布时间】:2020-10-29 16:53:57 【问题描述】:

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

Text(endDate, style: .relative)

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

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

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

【问题讨论】:

这是否回答了您的问题***.com/a/63425455/12299030? 【参考方案1】:

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

    创建一个条目,其中endDate 是可选的 - 如果是nil,则表示倒计时结束:
struct SimpleEntry: TimelineEntry 
    let date: Date
    var endDate: Date?

    在您的 Provider 中创建两个条目 - 一个用于倒计时时间,一个用于倒计时结束:
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)
    

    在您的视图中使用它:
struct WidgetEntryView: View 
    var entry: Provider.Entry

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

【讨论】:

谢谢不知道我可以使用这样的实体,效果很好!【参考方案2】:

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

【讨论】:

以上是关于当达到零时停止 SwiftUI 小部件的相对文本字段计数器?的主要内容,如果未能解决你的问题,请参考以下文章

Kivy:从另一个类的小部件中检索文本?

在 SwiftUI 小部件中添加观察者的位置

为啥当主应用停止时我的小部件广播接收器服务停止

当 Flutter 中的全局变量更改(异步)时更新小部件

SwiftUI 小部件无法刷新

当运行它的小部件(QDialog)在没有多线程的情况下关闭时,如何停止长 for 循环?