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 未更新的主要内容,如果未能解决你的问题,请参考以下文章

仅限于 WidgetKit 时间线条目?

WidgetKit - API 调用

WidgetKit - 与文本和图像的链接

我无法从 widgetKit 扩展上的应用程序中检索 xcdatamodeld 数据

如果正在使用我的小部件,如何查询 WidgetKit?

在 WidgetKit 的应用程序组上存储一个数组