【问题标题】:Immediate loading of UserDefaults (App Storage)立即加载 UserDefaults(应用存储)
【发布时间】: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....' 包装器。
  • 好的,这个怎么用?

标签: ios swiftui userdefaults 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 包装器,您可以在父视图中创建一个并将其传递给子视图。

【讨论】:

【解决方案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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多