如何在 WidgetKit,SwiftUI 中更改午夜视图?
How to change view on midnight in 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,但我不确定该怎么做。
关于如何从小部件更改午夜视图的任何想法?
- 假设你有一个条目(在你的应用程序中你有
entry.state...
但对于这个例子我使用了一个简化版本):
struct SimpleEntry: TimelineEntry {
let date: Date
let lesson: Lesson
}
- 设置您的 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)
政策,您可以指定何时重新加载您的时间轴(以及您的窗口小部件视图)。
我有一个代码:
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,但我不确定该怎么做。 关于如何从小部件更改午夜视图的任何想法?
- 假设你有一个条目(在你的应用程序中你有
entry.state...
但对于这个例子我使用了一个简化版本):
struct SimpleEntry: TimelineEntry {
let date: Date
let lesson: Lesson
}
- 设置您的 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)
政策,您可以指定何时重新加载您的时间轴(以及您的窗口小部件视图)。