【问题标题】:UserDefaults state not refreshUserDefaults 状态不刷新
【发布时间】: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,它也没有更新。

【问题讨论】:

标签: ios swift date swiftui userdefaults


【解决方案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。
检查将失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多