SwiftUI:如何从 macOS 内部覆盖 TextField 的值

问题描述 投票:0回答:2

我正在尝试根据现有值限制 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 的值,一切正常。似乎从内部更新文本字段的值不会导致刷新。

我错过了什么?

macos swiftui textfield
2个回答
0
投票

我得到的建议是 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)
}
}

0
投票

尝试使用

.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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.