【发布时间】:2022-01-21 19:02:25
【问题描述】:
我有一个简单的两个选项卡式应用程序,我正在尝试管理 List 何时或是否从网络重新加载数据。
我希望应用仅在以下情况下重新加载数据:
- 首次冷启动(关闭状态启动);
- 从
.background到.active状态;或 - 切换
SettingsView()中的设置
我不希望 List 在不切换选项或一般只切换标签的情况下转到 SettingsView() 时重新加载。
// tab view
struct Tabs: View {
var body: some View {
TabView {
ViewOne().tabItem { Label("Settings", systemImage: "gear") }
ViewTwo().tabItem { Label("List", systemImage: "bag") }
}
}
}
// ViewOne
struct ViewOne: View {
var body: some View {
Text("View one: Settings")
// toggles and options here
.onChange(of: option) { value in
// do other things here
UserDefaults.standard.set(true, forKey: "reloadList")
}
}
}
// ViewTwo
struct ViewTwo: View {
var body: some View {
List(arrayItems) { item in
}
.onAppear {
if( UserDefaults.standard.bool(forKey: "reloadList") ) {
reloadData()
UserDefaults.standard.removeObject(forKey: "reloadList")
}
}
}
}
以上在运行应用程序时有效,我切换设置 - UserDefaults 触发 reloadData() 函数。这也解决了我切换标签(无需设置更改)和不重新加载数据的困境。
但是,由于该表在启动时(冷态或背景)无法获取数据,因此我现在用糟糕的 UX 将自己击中了脚。
我尝试将另一个UserDefaults.standard.set(true, "coldLaunch") 添加到Tabs 视图,然后将reloadList 设置为true,但直到切换标签然后再返回时才会触发。
我也尝试过从@Environment(\.scenePhase) var scenePhase 设置或触发reloadData(),但这会在每次启动时触发onAppear。
也许我没有直接思考,但我试图找出正确的流程效果但不能!
【问题讨论】:
标签: swift swiftui nsuserdefaults swiftui-list