UserDefaults 状态不刷新
Posted
技术标签:
【中文标题】UserDefaults 状态不刷新【英文标题】:UserDefaults state not refresh 【发布时间】:2021-03-21 11:20:38 【问题描述】:我使用“UserDefaults”来存储用户重新加载页面的日期时间。但是,我发现即使时间过去了它也不会刷新
final class ModelData: ObservableObject
@Published var lastLaunchDate: Date = UserDefaults.standard.value(forKey: "lastLaunch") as? Date ?? Date()
func getTimeStamp() -> Date
let now_components = Calendar.current.dateComponents([.month, .day, .hour, .minute], from: Date())
let lastLaunch_components = Calendar.current.dateComponents([.month, .day, .hour, .minute], from: lastLaunchDate)
print(now_components.minute, lastLaunch_components.minute)
if now_components.minute != lastLaunch_components.minute
lastLaunchDate = Date()
UserDefaults.standard.setValue(lastLaunchDate, forKey: "lastLaunch")
print(now_components.minute, lastLaunch_components.minute)
return lastLaunchDate
由于我正在测试,我使用“分钟”来简化我的测试。我希望当分钟发生变化时,上面的代码会更新我的 userDefaults。
struct HomeView: View
@EnvironmentObject var modelData: ModelData
var body: some View
Text("\(modelData.getTimeStamp())")
我发现我浏览到另一个页面,返回 HomeView。时间戳根本没有得到更新。我打印了 lastLaunchDate,它也没有更新。
【问题讨论】:
这是否回答了您的问题***.com/a/62716736/12299030? 【参考方案1】:我发现我浏览到另一个页面,返回 HomeView。这 时间戳根本没有得到更新。
如果您导航回父 View
,除非发生更改,否则 SwiftUI 不会重新渲染它。
相反...您将需要使用 .onAppear
视图修饰符来调用您的函数。
另外,Text("\(modelData.getTimeStamp())")
不是很 SwiftUI
,尤其是在您的情况下。
既然您有@Published var lastLaunchDate
,请按原样使用它:
Text("\(modelData.lastLaunchDate)")
现在当lastLaunchDate
发生变化时,SwiftUI
引擎会自动更新View
。
解决办法:
final class ModelData: ObservableObject
@Published var lastLaunchDate = UserDefaults.standard.value(forKey: "lastLaunch") as? Date ?? Date()
func refresh()
let compareDate = Date()
let refreshInterval = TimeInterval(3) //3 second interval for test purpose
if compareDate.timeIntervalSince(lastLaunchDate) > refreshInterval
lastLaunchDate = compareDate
UserDefaults.standard.setValue(lastLaunchDate, forKey: "lastLaunch")
struct ContentView: View
@EnvironmentObject var modelData: ModelData
var body: some View
NavigationView
VStack
Text("\(modelData.lastLaunchDate)")
NavigationLink(destination: Text("Destination"),
label: Text("Navigate") )
.onAppear
modelData.refresh()
注意:if now_components.minute != lastLaunch_components.minute
容易出错。
示例:比较上次更新时间 00:01 和当前时间 01:01。
检查将失败。
【讨论】:
以上是关于UserDefaults 状态不刷新的主要内容,如果未能解决你的问题,请参考以下文章
只有 NSDictionary 中的属性列表对象(NSNumber),但不能在 UserDefaults 中存储 dict