ios - 当达到零时停止 SwiftUI 小部件的相对文本字段计数器?
问题描述
我正在创建一个小部件,它有一个从日期开始倒计时的文本字段,如下所示:
Text(endDate, style: .relative)
这很好用,但是作为它的相对值,一旦它达到零,它将继续重新计数,因为 endDate 成为过去。
有没有办法在文本达到零时终止文本?还是我必须使用计时器重建此功能?
我需要做的就是从开始日期倒计时到结束日期,然后使文本字段无效或显示一条消息。
解决方案
这是创建倒计时以及时间结束时显示其他文本的方法。
- 创建一个
endDate
可选的条目 - 如果nil
它意味着倒计时结束:
struct SimpleEntry: TimelineEntry {
let date: Date
var endDate: Date?
}
- 在您的提供者中创建两个条目 - 一个用于倒计时时间,一个用于倒计时结束时:
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")
}
}
}
推荐阅读
- swift - Xcode Swift 单元测试输出过于冗长
- performance - 打开和关闭图层的最节省资源的方法是什么?
- laravel - 为什么我的模型在创建或更新后没有触发某些事件
- javascript - 通过编辑文件通过 Node.js 更改 JSON 中的对象值
- c++ - 错误:“新”不能出现在常量表达式中
- angularjs - 使用方法 Post AngularJs 时出错
- java - 跳过一个 Maven 测试不起作用
- powershell - 通过电子邮件发送 foreach 输出
- javascript - OpenLayer 加载带有初始标记的地图
- java - SQLiteAssetHelper - 如何使用 AssetHelper 将新数据插入现有数据库?