我正在创建一个Widget,它有一个从日期开始倒计时的文本字段,如下所示:
Text(endDate, style: .relative)
字符串这很好,但是作为它的相对值,一旦它达到零,它将继续计数,因为endDate变成了过去。有没有一种方法可以在文本达到零时终止文本?或者我必须用计时器重建这个功能?所有我需要做的是倒计时从开始日期和结束日期,然后无效的文本字段或显示一条消息。
ax6ht2ek1#
这里是如何创建一个倒计时,当时间结束时显示一些其他文本。1.创建一个条目,其中endDate是可选的-如果它是nil,则意味着倒计时结束:
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") } } }
型
xggvc2p62#
从iOS 16开始,现在可以通过将Text的'countsDown'参数设置为true来停止在0。https://developer.apple.com/documentation/swiftui/text/init(timerinterval:pausetime:countsdown:showshours:)
w46czmvw3#
我认为你必须在时间为零时安排一个小部件更新,并有条件在小于零时隐藏它。
3条答案
按热度按时间ax6ht2ek1#
这里是如何创建一个倒计时,当时间结束时显示一些其他文本。
1.创建一个条目,其中
endDate
是可选的-如果它是nil
,则意味着倒计时结束:字符串
1.在您的提供程序中创建两个按钮-一个用于 * 倒计时 * 时间,另一个用于倒计时结束时:
型
1.在视图中使用它:
型
xggvc2p62#
从iOS 16开始,现在可以通过将Text的'countsDown'参数设置为true来停止在0。
https://developer.apple.com/documentation/swiftui/text/init(timerinterval:pausetime:countsdown:showshours:)
w46czmvw3#
我认为你必须在时间为零时安排一个小部件更新,并有条件在小于零时隐藏它。