我有一个按钮可以切换颜色状态(布尔类型),前景色和边框颜色从蓝色变为绿色。它很好用。但是现在我想在离开“视图”或关闭应用程序时保存状态。
但我认为使用“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)
}
}
一般来说,最好在 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;
}