值更改时 Swiftui Textfield 不更新

Eri*_*ric 4 state textfield swiftui

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

这是我的代码:

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)")
                }
            
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

你能解释一下吗?

Yrb*_*Yrb 8

答案很简单,当TextFields它们处于焦点时不要更新。要解决此问题,您需要将 a 合并@FocusState到视图中,并TextField在更新变量之前使 失去焦点。Text您可以在点击 之前点击您自己的视图来测试它TextField。你会看到它更新得很好。

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)")
                    }
                
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)