[英]UserDefaults state not refresh
我使用“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())")
}
}
我發現我瀏覽到另一個頁面 go 回到 HomeView。 時間戳根本沒有得到更新。 我打印了 lastLaunchDate,它也沒有更新。
我發現我瀏覽到另一個頁面 go 回到 HomeView。 時間戳根本沒有得到更新。
如果您導航回父View
, SwiftUI 不會重新渲染它,除非有什么變化。
相反......您將需要使用.onAppear
視圖修飾符來調用您的 function。
此外, 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。
檢查將失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.