import SwiftUI
struct CardTheme: View {
//@State private var theme = 0
@State private var theme = UserDefaults.standard.integer(forKey: "Card Theme")
var body: some View {
List {
HStack {
Text("Mono")
//.font(.system(size: 12))
.onTapGesture {
self.setTheme(i: 0)
}
Spacer()
if(theme == 0) {
Image(systemName: "checkmark")
.foregroundColor(Color.green)
}
}
HStack {
Text("Cool")
// .font(.system(size: 12))
.onTapGesture {
self.setTheme(i: 1)
}
Spacer()
if(theme == 1) {
Image(systemName: "checkmark")
.foregroundColor(Color.green)
}
}
HStack {
Text("Cute")
// .font(.system(size: 12))
.onTapGesture {
self.setTheme(i: 2)
}
Spacer()
if(theme == 2) {
Image(systemName: "checkmark")
.foregroundColor(Color.green)
}
}
}
.navigationBarTitle(Text(verbatim: "Card Theme"))
}
func setTheme(i: Int) {
theme = i
UserDefaults.standard.set(i, forKey: "Card Theme")
}
}
我有一个设置菜单,用户可以在其中选择一个主题,默认值设置为全局变量globalVarTheme,该值为0。但是在选择之后,退出该菜单,然后重新进入菜单返回0(第一项),即使他们选择了其他一项。如何保存他们的选择?
此外,在当前应用会话之外保存用户选择的最佳方法是什么?我应该将所有选择都写到plist文件中还是有常规方法?
答案 0 :(得分:0)
@State
用于给定视图中的更改。这并不意味着在所有视图中都存在。而是使用@Environment
属性包装器。 WWDC 2019讨论何时使用什么。
答案 1 :(得分:0)
@State不是正确的PropertyWrapper。
如果要在多个视图中使用设置,请使用@EnvironmentObject作为PropertyWrapper。
您可以在此处了解不同的PropertyWrappers: https://medium.com/@alex.hsieh/state-objectbinding-and-environmentobject-in-swiftui-783588b60671
如果要将设置保存到当前应用会话之外,可以使用UserDefauls。 How do I use UserDefaults with SwiftUI?