我正在尝试根据现有值限制 TextField 的文本输入以消除重复输入。如果我检测到重复项,我将更改输入的值。
我的代码有效。如果我检测到错误的值并尝试替换它,那么该值将被正确覆盖。即使调试器显示正确的值,更改也不会反映回 TextField(或文本)。
这是我的代码:
import SwiftUI
struct ContentView: View
{
@State var text: String = ""
var body: some View
{
TextField("Select an item", text: $text)
{
if text == "12345"
{
self.text = "00000"
}
}
.padding()
Text(text)
}
}
如果您在 TextField 中输入“12345”并按回车键,变量将更新为“00000”,但 TextField 仍然顽固地显示“12345”。
现在我不想使用 .onChange 因为每次按键都会触发它并会产生误报(令人讨厌的是 .onChange 确实正确更新了文本值)。
即如果我的数据库已经有以下值:
1
12
123
然后尝试使用 .onChange 键入 12345 会在仅键入 1 后发现错误的重复项。
我还尝试引入第二个 TextField 并从第一个 TextField 更新该 TextField 的值,一切正常。似乎从内部更新文本字段的值不会导致刷新。
我错过了什么?
我得到的建议是 onCommit 闭包将被弃用并使用 onSubmit。使用它似乎可以按预期工作。
struct ContentView: View
{ @State var 文本:String = ""
var body: some View
{
TextField("Select an item", text: $text)
// {
// if text == "12345"
// {
// self.text = "00000"
// }
// }
.onSubmit({
if text == "12345" {self.text = "00000" }
})
.padding()
Text(text)
}
}
尝试使用
.onSubmit{...}
,像这样:
struct ContentView: View {
@State var text: String = ""
var body: some View {
TextField("Select an item", text: $text)
.onSubmit {
if text == "12345" {
text = "00000"
}
}
.padding()
Text(text)
}
}
您也可以使用这种方法来更新
text
中的TextField
,当您键入:
struct ContentView: View {
@State var text: String = ""
var body: some View {
TextField("Select an item", text: Binding<String>(
get: { text } ,
set: { txt in
if txt == "12345" {
text = "00000"
} else {
text = txt
}
})
)
.padding()
Text(text)
}
}