UserDefaults 使用@State Bool 变量不保存状态

问题描述 投票:0回答:1

我有一个按钮可以切换颜色状态(布尔类型),前景色和边框颜色从蓝色变为绿色。它很好用。但是现在我想在离开“视图”或关闭应用程序时保存状态。

但我认为使用“Bool typ”并不像使用字符串那么容易。

import SwiftUI
struct CLPrepView: View {
    
    UserDefaults.standard.set(false, forKey: "colorsave")
    UserDefaults.standard.set(false, forKey: "bordersave")

    @State private var mycolor:Bool = false
    @State private var myborder:Bool = false

 var body: some View {
        
        ZStack {
            Color(.black)
                .ignoresSafeArea()
             
                Button(action: {
                    self.mycolor.toggle()
                    self.myborder.toggle()
                    UserDefaults.standard.set(mycolor, forKey: "colorsave")
                    UserDefaults.standard.set(myborder, forKey: "bordersave")
                }) {
                    
                    Text("Button")
                        
                }
                .frame(width: 600, height: 30, alignment: .leading)
                .padding(.all, 20)
                .background(.black)
                .foregroundColor(mycolor ? Color.green : Color.blue)
                .border(myborder ? Color.black : Color.blue)
}
}
swift xcode button boolean userdefaults
1个回答
0
投票

一般来说,最好在 SwiftUI 中使用

@AppStorage
属性包装器,而不是尝试直接操作
UserDefaults
。 @AppStorage 以一种对 SwiftUI 更友好的方式直接绑定到 UserDefaults 值。

struct AppStorageTest: View {
    
    //create and initialize @AppStorage property wrappers
    @AppStorage("myColor") var myColor:Bool = false
    @AppStorage("myBorder") var myBorder:Bool = false

    var body: some View {
        
        ZStack {
            Color(.black)
                .ignoresSafeArea()
            
            Button(action: {
                myColor.toggle() //changes happen immediately 
                myBorder.toggle() //no need to write to UserDefaults
            }) {
                Text("Button")
            }
            .frame(width: 600, height: 30, alignment: .leading)
            .padding(.all, 20)
            .background(.black)
            .foregroundColor(myColor ? Color.green : Color.blue)
            .border(myBorder ? Color.black : Color.blue)
        }
    }
}

通过终端确认您的默认设置:

$ defaults read org.myApp.BundleIdentifier
{
    myBorder = 1;
    myColor = 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.