所以我有一个可将切换状态和选择器选择记录到UserDefaults中的类
import Foundation
import Combine
class UserSettings: ObservableObject {
@Published var shouldSort: Bool {
didSet {
UserDefaults.standard.set(shouldSort, forKey: "shouldSort")
}
}
@Published var sortKey: String {
didSet {
UserDefaults.standard.set(sortKey, forKey: "sortKey")
}
}
public var sortKeys = ["alphabetical", "length", "newest", "oldest"]
init() {
self.shouldSort = UserDefaults.standard.object(forKey: "shouldSort") as? Bool ?? true
self.sortKey = UserDefaults.standard.object(forKey: "sortKey") as? String ?? "Name"
}
}
在我的设置页面上,我使用以下代码
@ObservedObject var userSettings = UserSettings()
...
Toggle(isOn: $userSettings.shouldSort, label: {Text("Sort Books")})
Picker(selection: $userSettings.sortKey, label: Text("Sort By"), content: {
ForEach(userSettings.sortKeys, id: \.self){ key in
Text(key)
}
})
此代码可以很好地更改值,因为如果我关闭并打开该应用程序,则视图将根据数据进行更新。我正在用
读取数据@State var sorted = UserDefaults.standard.bool(forKey: "shouldSort")
@State var sort = UserDefaults.standard.string(forKey: "sortKey")
在我的内容视图中。 (shouldSort调用一个函数进行排序,如果为true,则sortKey确定数据的排序方式)
我是否使用@State变量读取了错误的数据(@State甚至可以检测到UserDefaults状态的变化)吗?
答案 0 :(得分:1)
忘记所有您在UIKit中学习到的有关UserDefaults的知识,并向SwiftUI中的AppStorage说声招呼,请使用以下代码:
@AppStorage("shouldSort") var sorted: Bool = false
@AppStorage("sortKey") var sort: String = ""