WidgetKit 未更新
Posted
技术标签:
【中文标题】WidgetKit 未更新【英文标题】:WidgetKit not updating 【发布时间】:2020-09-30 15:41:59 【问题描述】:例如,我希望我的小部件每 5 秒更新一次。我不知道为什么它不起作用。代码应该是对的。
更新代码:
func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ())
var entries: [SimpleEntry] = []
let currentDate = Date()
for _ in 0 ..< 5
let entryDate = Calendar.current.date(byAdding: .minute, value: 60, to: currentDate)!
let entry = SimpleEntry(date: entryDate, configuration: configuration, clubname: networkManager.clubName)
entries.append(entry)
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
【问题讨论】:
这应该会有所帮助***.com/questions/64086234/…。 你的意思是我需要添加一个for循环? 如果您想每 5 秒更新一次 Widget,您需要提前创建条目。这么频繁地刷新时间线是不可能的。这是一个可能的例子:Updating time text label each minute in WidgetKit 你能检查一下更新后的代码吗? @submariner 但是你想在每个条目中显示什么? 【参考方案1】:因为您添加了相同的条目。如果您像下面的示例更改值,它将被刷新。
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ())
var entries: [SimpleEntry] = []
// Generate a timeline consisting of five entries an hour apart, starting from the current date.
let currentDate = Date()
let chapter = getChapterWith(level: "1") // it is returned a array.
for index in 0 ..< chapter.count
let entryDate = Calendar.current.date(byAdding: .second, value: index, to: currentDate)!
let entry = SimpleEntry(date: entryDate, chapter: chapter[index])
entries.append(entry)
let timelineDate = Calendar.current.date(byAdding: .second, value: 1, to: Date())!
let timeline = Timeline<SimpleEntry>(entries: entries, policy: .after(timelineDate))
completion(timeline)
func getChapterWith(level: String) -> [Chapter]
return []
//Chapter是一个struct,它是SimpleEntry中的一个变量。
struct SimpleEntry: TimelineEntry
let date: Date
let chapter: Chapter
【讨论】:
Sagol :) 但我得到错误找不到 getChapterWith 您可以使用字符串数组设置章节变量。此外,您可以使用字符串变量更改 SimpleEntry 对象。 对不起,我真的不明白你的意思。我不明白你在做什么:getChapterWith(level: "1") 我更新了我的答案并添加到 getChapterWithFunc 的示例中。 getChapterWith 是一个函数,它返回一个特定于我的项目域的章节数组。所以,我返回了你可以自定义的空数组。【参考方案2】:您每次都在为同一日期添加时间线条目:
let currentDate = Date() // currentDate = now
for _ in 0 ..< 5
let entryDate = Calendar.current.date(byAdding: .minute, value: 60, to: currentDate)! // entryDate is ALWAYS currentDate + 60 minutes
let entry = SimpleEntry(date: entryDate, configuration: configuration, clubname: networkManager.clubName)
entries.append(entry)
改为使用 var 并更新:
var entryDate = Date()
for _ in 0 ..< 5
entryDate = Calendar.current.date(byAdding: .minute, value: 60, to: entryDate)!
let entry = SimpleEntry(date: entryDate, configuration: configuration, clubname: networkManager.clubName)
entries.append(entry)
【讨论】:
如果我们不使用那个for循环怎么办?数据只会更新一次? 如果你不循环,通常会发生这种情况,是的...¯_(ツ)_/¯ 搞不懂它背后的逻辑,因为每次排期都会调用它,然后可以为下一次更新做准备,那么多次计划的着急是什么? 上面的循环添加了五个时间线条目,以便小部件在接下来的五个小时内每小时更新一次。时间线允许小部件在相关时间使用相关信息进行更新。由您决定小部件何时完全刷新其数据并创建新时间线(替换旧时间线)。每次刷新数据时,您都应该设置相关的时间线。因此,逻辑是:数据到达 > 使用该数据创建时间线 > 新数据到达 > 使用该数据创建时间线。以上是关于WidgetKit 未更新的主要内容,如果未能解决你的问题,请参考以下文章