Остановка счетчика относительного текстового поля виджета SwiftUI при достижении нуля?

Я создаю виджет с текстовым полем, которое отсчитывается от даты, например:

Text(endDate, style: .relative)

Это работает нормально, однако, как его родственник, как только он достигает нуля, он будет продолжать считать снова, поскольку endDate становится в прошлом.

Есть ли способ завершить текст, когда он достигнет нуля? Или мне нужно перестраивать эту функцию с таймером?

Все, что мне нужно сделать, это отсчитать от даты начала до даты окончания, а затем сделать недействительным текстовое поле или показать сообщение.


person jwarris91    schedule 29.10.2020    source источник
comment
Отвечает ли это на ваш вопрос stackoverflow.com/a/63425455/12299030?   -  person Asperi    schedule 29.10.2020


Ответы (2)


Вот как вы можете создать обратный отсчет, а когда время истечет, отобразить другой текст.

  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")
        }
    }
}
person pawello2222    schedule 29.10.2020
comment
спасибо, не знал, что могу использовать такую ​​сущность, отлично работает! - person jwarris91; 30.10.2020

Я думаю, вам нужно запланировать обновление виджета в нулевое время и иметь условия, чтобы скрыть его, когда оно меньше нуля.

person Joseph Lord    schedule 29.10.2020