当前位置: 首页 > 知识库问答 >
问题:

UserDefaults状态不刷新

傅峰
2023-03-14

我使用“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,它也没有更新。

共有1个答案

严劲
2023-03-14

我发现我浏览到另一个页面,回到HomeView。时间戳根本没有更新。

如果导航回父视图,SwiftUI不会重新呈现它,除非发生更改。
相反...您将需要使用.onopere视图修饰符来调用函数。

此外,文本(“\(ModelData.GetTimestamp())”)不是很快速尤其是在您的情况下。
由于您有@published var lastlaunchdate,请按其本意使用它:

Text("\(modelData.lastLaunchDate)")

现在,当LastLaunchDate更改时,SwifTui引擎将自动更新视图

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()
            }
        }
    }
}

注意:
如果now_components.minute!=lastlaunch_components.minute容易出错。
示例:比较00:01的last-update-time和01:01的current-time。
检查将失败。

 类似资料:
  • 我现在正在学习React,但在重新渲染组件时遇到了问题。应用程序。js代码: 问题是不是最新的。它总是弱智,这是以前的状态。我试图调用一个在和的回调中,但是它仍然不起作用,我不知道为什么。

  • 2.19 刷新状态查询 2.19.1 描述 返回刷新进度 2.19.2 请求地址 地址: https://api.bokecs.com/queryrefresh/{package_id} 2.19.3 请求方式 GET 2.19.4 请求参数 参数名称 是否必须 参数描述 package_id 是 刷新接口中code为200时返回的message 2.19.5 请求格式 json 2.19.6 举

  • 我的应用程序使用Firebase API进行用户身份验证,将登录状态保存为Vuex状态下的布尔值。 当用户登录时,我设置登录状态并相应地有条件地显示登录/注销按钮。 但是当页面刷新时,vue应用的状态丢失并重置为默认 这会导致一个问题,即使用户登录并刷新页面,登录状态也会被设置为false,并且显示登录按钮而不是注销按钮,即使用户保持登录状态... 我该怎么做才能防止这种行为 我应该使用cooki

  • 我正在使用Angular材质选项卡,并且我的所有元素在切换到不同的选项卡(具有克隆网格)后都变得陈旧。不是对我网格上的所有20个元素都这样做,而是有办法刷新页面上的所有元素,这样我的引用就不会陈旧? 我们正在努力获取网格上的价值。 陈旧元素引用:元素未附加到页面文档

  • 我们正在构建一个具有两个流的应用程序: 大量信息流 我们希望连接这两个流以获得共享状态,以便第一个流可以使用第二个状态进行扩展。 每天左右,拼花文件(第二流的源代码)都会更新,这需要我们清除第二流的状态并重建它(可能需要大约2分钟)。 问题是,我们可以在该进程运行时阻止/延迟来自第一流的消息吗? 谢谢。

  • 我正在使用本教程学习AngularJS和ionic framework: http://www.htmlxprs.com/post/12/tutorial-on-using-parse-rest-api-and-ionic-framework-together 直到我在createTodo状态下创建一个新项,然后调用$state时,一切都很正常。go('todos')要返回到我的项目列表,以下是创