从设置页面,我想:
给定以下(简单)代码:
// User defaults wrapper
class SettingsProvider: ObservableObject {
static let shared = SettingsProvider()
var savedValue: String {
get { UserDefaults.standard.string(forKey: "userdefaultskey") ?? "Default value" }
set {
UserDefaults.standard.setValue(newValue, forKey: "userdefaultskey")
objectWillChange.send()
}
}
}
struct SettingsView: View {
var body: some View {
NavigationView {
NavigationLink("Open child", destination: ChildView())
}
}
}
struct ChildView: View {
@ObservedObject var settingsProvider = SettingsProvider.shared
@State var text: String = SettingsProvider.shared.savedValue
var body: some View {
Text("Value is \(settingsProvider.savedValue)")
TextField("Enter value", text: $text).background(Color.gray)
Button("Save value") {
settingsProvider.savedValue = text
}
}
}
我有以下行为:video
有人可以向我解释为什么我第二次打开它时 TextField
包含 Default value
吗?
这是我应该报告的 SwiftUI 中的错误,还是我遗漏了什么?
如果我杀死并重新打开应用程序,文本字段将包含(如预期的那样)Other value
。
答案 0 :(得分:0)
您可以像这样在按钮下添加一个 onAppear { text = SettingsProvider.shared.savedValue }
:
var body: some View {
Text("Value is \(settingsProvider.savedValue)")
TextField("Enter value", text: $text).background(Color.gray)
Button("Save value") {
settingsProvider.savedValue = text
}
.onAppear {
text = SettingsProvider.shared.savedValue // <= add this
}
}