立即加载 UserDefaults(应用存储)

Posted

技术标签:

【中文标题】立即加载 UserDefaults(应用存储)【英文标题】:Immediate loading of UserDefaults (App Storage) 【发布时间】:2020-12-31 15:08:59 【问题描述】:

我在 SwiftUI 中通过 UserDefaults (App Storage) 保存整数,但现在的问题是,在不同的结构中,整数仅在重新启动应用程序后加载,但当您单击导航链接时,整数应该立即加载视图来了。整数(通过 if 查询以文本的形式)立即加载到相同的结构中。

如果有人可以帮助我,我很高兴。

提前谢谢你:)

演示代码:

import SwiftUI

struct Monday1BCalendarView: View 
    
    
    @AppStorage("Monday1B") var Monday1B: Int = 1
    
    
    var body: some View 
        
            
            Form
                Section(header: Text("Main"))
                    
                    
                    Button(action: 
                        self.Montag1B = 0;
                    , label: 
                        Text("Maths")
                            .foregroundColor(.primary)
                    )


并加载:


import SwiftUI


struct CalendarMainView: View 
    
    var Monday1B: Int = UserDefaults.standard.integer(forKey: "Monday1B")
    
    
    var body: some View 
        NavigationView 

            VStack
                ZStack
                    
                    Image("Stundenplan")
                        .resizable()
                        .frame(width: 360, height: 200, alignment: .center)
                        .position(x: 200, y: 100)
                    
                  
                    if Montag1B == 0 
                        
                        Text("Mathe")
                    
                    

【问题讨论】:

你会为某个问题添加演示代码吗? 您需要对变量使用 '@AppStorage....' 包装器。 好的,这个怎么用? 【参考方案1】:

这行在初始化时只会从UserDefaults读取:

struct CalendarMainView: View 
    var Monday1B: Int = UserDefaults.standard.integer(forKey: "Monday1B")

如果你想观察这个值的变化,你需要@AppStorage:

struct CalendarMainView: View 
    @AppStorage("Monday1B") var Monday1B: Int = 1
    ...

如果您最终拥有多个 @AppStorage 包装器,您可以在父视图中创建一个并将其传递给子视图。

【讨论】:

谢谢,我是 Swift 初学者,抱歉我的问题很糟糕。另外,我来自德国,很抱歉我的英语不好。 @LeoSaischowa 如果我的回答解决了您的问题,请接受。见What should I do when someone answers my question?【参考方案2】:

你必须在两个(所有)地方都使用@AppStorage

struct CalendarMainView: View 
    
    // this automatically updated
    @AppStorage("Montag1B") var Montag1B: Int = 0    

    // this read only once - on initialization
    //var Montag1B = UserDefaults.standard.integer(forKey: "Montag1B")

【讨论】:

以上是关于立即加载 UserDefaults(应用存储)的主要内容,如果未能解决你的问题,请参考以下文章

UserDefaults removeObjectForKey 不起作用?

您是不是能够跨不同的视图控制器/.swift 文件检索存储在 UserDefaults 中的数据?

如何在 Xcode 中终止并重新打开应用程序后检查 UserDefaults (swift)

在 iOS 上存储对象 - 最佳解决方案?

与应用程序和扩展程序共享时,UserDefaults 数据存储在哪里?

Core Data 和 Userdefaults 不存储数据