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)")
}
}
}
}
}
我在表单上有一个文本字段,用户可以在其中键入值,但我还想使用按钮更新文本字段的内容。
这是我的代码:
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)")
}
}
}
}
}