簡體   English   中英

UserDefaults state 不刷新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM