问题描述
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策略之后每隔5分钟刷新一次UI
这会导致不良的UX
在UserDefaults
中更改配置后,如何立即刷新窗口小部件内容?
感谢您的支持。
解决方法
在Keeping a Widget Up to Date by Apple中,要通知您的小部件更新其时间轴和其内容,请致电:
WidgetCenter.shared.reloadAllTimelines()
这将重新加载您的应用程序具有的所有小部件。如果要重新加载特定的小部件(如果您的应用具有多种不同的小部件类型),请改用WidgetCenter.shared.reloadTimelines(ofKind: "com.myApp.myWidget")
。
为阐明整个工作流程,我在此处添加一些说明:
您不仅可以从WidgetCenter
来调用widget
,而且可以从您的主应用程序中调用。
WidgetCenter.shared.reloadAllTimelines()
WidgetCenter.shared.reloadTimelines(ofKind: "com.myApp.myWidget........")
所以流程是:
-
用户在MainApp上进行了一些更改,例如:我重新排列了以下列表中的库存项目
-
MainApp将数据保存到
UserDefaults
,例如:保存列表项顺序 -
MainApp触发重新加载窗口小部件,方法是:
WidgetCenter.shared.reloadTimelines(ofKind: "mone24h_widget")
您可以通过查看窗口小部件条目文件来获得
kind
:@main struct mone24h_widget: Widget { let kind: String = "mone24h_widget"
-
小部件将重新加载时间线,我将从此处的
UserDefaults
获取共享数据。完成工作。例如:根据MainApp传递的安排重新渲染我的股票清单
顺便说一句,如果您使用的是react-native,我已经创建了一个模块来支持此问题: