Как изменить вид полуночи в WidgetKit, SwiftUI?

У меня есть код:

struct ContentView: View {
    let entry: LessonWidgetEntry
    private static let url: URL = URL(string: "widgetUrl")!
    var body: some View {
        VStack {
            switch entry.state {
            case .none:
                ProgramNotStartedView()
            case .currentLesson(let lesson):
                LessonView(lesson: lesson, imageName: entry.program?.imageName)
            case .lessonCompleted(let lesson):
                LessonCompletedView(lesson: lesson)
            case .programCompleted:
                ProgramCompletedView()
            }
        }.widgetURL(ContentView.url)
    }
}

В полночь LessonCompletedView должен измениться на LessonView, но я не знаю, как это сделать. Есть идеи, как изменить вид в полночь из виджета?


person Jkrist    schedule 05.10.2020    source источник
comment
да. Спасибо @ pawello2222! Вы всегда помогаете мне с виджетами: D Я все еще в основном использую swift, а для виджетов использовал только swiftui, поэтому время от времени у меня все еще возникают проблемы :)   -  person Jkrist    schedule 22.10.2020


Ответы (1)


  1. Предполагая, что у вас есть запись (в вашем приложении есть entry.state..., но для этого примера я использовал упрощенную версию):
struct SimpleEntry: TimelineEntry {
    let date: Date
    let lesson: Lesson
}
  1. Настройте TimelineProvider на обновление временной шкалы после следующей полуночи:
struct SimpleProvider: TimelineProvider {
    ...

    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
        let currentDate = Date()
        let midnight = Calendar.current.startOfDay(for: currentDate)
        let nextMidnight = Calendar.current.date(byAdding: .day, value: 1, to: midnight)!

        let entries = [
            SimpleEntry(date: currentDate, lesson: Lesson()) // pass the lesson here
        ]

        let timeline = Timeline(entries: entries, policy: .after(nextMidnight))
        completion(timeline)
    }
}

В TimelineProvider вы можете пройти любой урок (в зависимости от дня или предыдущего урока - решать вам). Вы также можете передать переменную Entry, указывающую, завершен ли урок.

Устанавливая политику .after(nextMidnight), вы указываете, когда вы хотите, чтобы ваша временная шкала (и, следовательно, виджет) была перезагружена.

person pawello2222    schedule 05.10.2020
comment
что такое entryDate в этом контексте? - person Richard Robinson; 31.05.2021
comment
@RichardRobinson Хороший улов, спасибо. Это дата, когда вы хотите показать запись, поэтому в данном случае это может быть просто текущая дата. - person pawello2222; 31.05.2021