这段代码不起作用:AppStorage实际上并不保存数据。
struct DayInfoView: View {
@State private var selectedDate: Date
@Environment(\.presentationMode) var presentationMode
@AppStorage("checkmarkVisible") private var checkmarkVisibleData: Data = Data()
@State private var checkmarkVisible: Set<Date> = [] {
didSet {
if let encoded = try? JSONEncoder().encode(checkmarkVisible) {
checkmarkVisibleData = encoded
}
print(checkmarkVisible)
}
}
var body: someView {
//// some code
Button(action: {
checkmarkVisible.insert(selectedDate)
}) {
Text("Button 2")
.foregroundColor(.white)
.padding()
.background(Color.blue)
.cornerRadius(8)
}
}
}
同样的错误行为也适用于直接的userdefaults方法调用。
class UserDefaultsService {
static let shared = UserDefaultsService()
func save<T: Codable>(_ value: T, forKey key: String) {
if let encoded = try? JSONEncoder().encode(value) {
UserDefaults.standard.set(encoded, forKey: key)
UserDefaults.standard.synchronize()
}
}
func load<T: Codable>(forKey key: String, defaultValue: T) -> T {
if let data = UserDefaults.standard.data(forKey: key),
let value = try? JSONDecoder().decode(T.self, from: data) {
return value
}
return defaultValue
}
}
struct DayInfoView: View {
@State private var selectedDate: Date
@Environment(\.presentationMode) var presentationMode
private let userDefaultsService = UserDefaultsService.shared
@State private var checkmarkVisible: Set<Date> = [] {
didSet {
userDefaultsService.save(checkmarkVisible, forKey: "checkmarkVisible")
print(checkmarkVisible)
}
}
init(selectedDate: Date) {
_selectedDate = State(initialValue: selectedDate)
let storedCheckmarkVisible: Set<Date> = userDefaultsService.load(forKey: "checkmarkVisible", defaultValue: Set<Date>())
_checkmarkVisible = State(initialValue: storedCheckmarkVisible)
}
为什么?如何解决这个问题?
synchronize也不行。
备注
这种行为是不可预测的。有时它会保存或不保存。
2条答案
按热度按时间00jrzges1#
我已经找到了解决方案-使用文件。但我不明白,如何使用appstorage/userdefaults
bxjv4tth2#
@AppStorage
和@SceneStorage
需要RawRepresentable<String>
只需将此代码添加到
.swift
文件中。然后你只需要一个变量,你不需要
@State
或didSet
。注意
AppStorage
和UserDefaults
只应该用于小的东西。设置像音量,音高等。