@State 属性保持初始值而不是更新

时间:2021-01-04 19:30:08

标签: ios binding swiftui state

从设置页面,我想:

  • 导航到子视图
  • 让用户输入更新文本字段中的某些值
  • 将此值保存在用户默认值中
  • 导航回设置
  • 如果用户再次打开子视图,用之前保存的值预填充文本字段

给定以下(简单)代码:

// 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

1 个答案:

答案 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
    }
}