Swiftui 文本字段在值更改时不更新

Swiftui Textfield not updating when value changes

我在表单上有一个文本字段,用户可以在其中键入值,但我还想使用按钮更新文本字段的内容。

这是我的代码:

struct test: View {
@State private var amount: Double = 0.0

var body: some View {
    Form {
        VStack {
            HStack {
                Text("Amount EUR")
                Spacer()
                TextField("Type amount", value: $amount, format: .number)
                    .keyboardType(.numberPad)
                    .multilineTextAlignment(.trailing)
            }
            
            Text("Set MAX (999)")
                .frame(maxWidth: .infinity, alignment: .leading)
                .onTapGesture {
                    print("before tap \(amount )")
                    amount = 999
                    print("after tap \(amount)")
                }
            
        }
    }
}

当我刚启动该应用程序时,第一次点击文本会将文本字段更新为 999,但之后它就不再起作用了。 amount 值已正确更新,但文本字段未反映更改。

你能解释一下吗?

答案很简单,TextFields 在焦点对准时不更新。要解决这个问题,您需要将一个 @FocusState 合并到视图中,并在更新变量之前使 TextField 失去焦点。在进入 TextField 之前,您可以通过点击 Text 在您自己的视图中对其进行测试。你会看到它更新得很好。

struct ButtonUpdateTextField: View {
    @State private var amount: Double = 0.0
    @FocusState var isFocused: Bool // <-- add here
    
    var body: some View {
        Form {
            VStack {
                HStack {
                    Text("Amount EUR")
                    Spacer()
                    TextField("Type amount", value: $amount, format: .number)
                        .keyboardType(.numberPad)
                        .multilineTextAlignment(.trailing)
                        .focused($isFocused) // <-- add here
                }
                
                Text("Set MAX (999)")
                    .frame(maxWidth: .infinity, alignment: .leading)
                    .onTapGesture {
                        print("before tap \(amount )")
                        isFocused = false // <-- add here
                        amount = 999
                        print("after tap \(amount)")
                    }
                
            }
        }
    }
}