【问题标题】:ios 14 widget: How to reload timeline after UserDefaults changedios 14 小部件:如何在 UserDefaults 更改后重新加载时间线
【发布时间】:2021-02-09 09:11:20
【问题描述】:

我有一个每 5 分钟刷新一次的 ios 14 小部件

let timeline = Timeline(entries: entries, policy: .atEnd)

entries 取决于我的 MainApp 上的配置。

我使用UserDefaults 在 MainApp 和 Widget 之间共享数据。

@AppStorage("FollowingCatalog", store: UserDefaults(suiteName: "group.vn.f19.com"))
var catalogItemsData: Data = Data()

我已经成功地根据UserDefaults 数据镜像了小部件内容。但我的问题是我的小部件仅在 .atEnd 策略后刷新 UI,每 5 分钟一次

这会导致糟糕的用户体验

如何在UserDefaults 中的配置更改后立即刷新小部件内容?

感谢您的支持。

【问题讨论】:

    标签: ios widget reload timeline userdefaults


    【解决方案1】:

    Keeping a Widget Up to Date by Apple,通知您的小部件更新其时间线和内容,您调用:

    WidgetCenter.shared.reloadAllTimelines()
    

    这会重新加载您的应用拥有的所有小部件。如果您想重新加载特定的小部件(如果您的应用有多种不同的小部件类型),请改用WidgetCenter.shared.reloadTimelines(ofKind: "com.myApp.myWidget")

    【讨论】:

    • 我昨天解决了这个问题,最初我尝试从小部件而不是我的主应用程序调用WidgetCenter.shared.reloadAllTimelines():D
    【解决方案2】:

    为了阐明整个工作流程,我在这里添加一些注释:

    您不仅可以从widget 调用WidgetCenter,还可以从您的主应用程序调用。

    WidgetCenter.shared.reloadAllTimelines()
    WidgetCenter.shared.reloadTimelines(ofKind: "com.myApp.myWidget........")
    

    所以流程是:

    1. 用户在 MainApp 上更改了一些内容,例如:我重新排列了以下列表中的库存项目

    2. MainApp 将数据保存到UserDefaults,例如:保存列表项顺序

    3. MainApp 通过以下方式触发重新加载小部件:

      WidgetCenter.shared.reloadTimelines(ofKind: "mone24h_widget")
      

      您可以通过查看您的小部件条目文件获得kind

      @main
      struct mone24h_widget: Widget {
         let kind: String = "mone24h_widget"
      
    4. Widget 将重新加载时间线,我将在此处从UserDefaults 获取共享数据。完成了工作。例如:根据 MainApp 传递的排列重新渲染我的股票列表

    【讨论】:

      【解决方案3】:

      顺便说一句,如果你使用 react-native,我已经创建了一个模块来支持这个问题:

      react-native-widget-bridge

      【讨论】:

        猜你喜欢
        • 2020-10-26
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2021-01-10
        • 1970-01-01
        • 2013-05-05
        相关资源
        最近更新 更多