swift 当TextField变为空时,不会触发onChange

czq61nw1  于 11个月前  发布在  Swift
关注(0)|答案(1)|浏览(130)

在键盘上键入会按预期触发.onChange,因此“changed”会正确地打印到控制台,除非用户删除了TextField中的所有字符。

struct CurrencyInput: View {
    @State var value: Double = 0
    
    var body: some View {
        TextField("Amount", value: $value, format: .number)
            .keyboardType(.decimalPad)
            .onChange(of: value) {
                print("changed")
                print(value)
            }
    }
}

字符串
从空的TextField开始,然后输入数字2,后面跟着一个退格键,

需要控制台日志

changed
2
changed
0


不过,我只得到这个

实际控制台日志

changed
2


TextField绑定更改为String似乎可以解决这个问题,但是我不能使用格式化程序。

struct CurrencyInput: View {
    @State var value: String = ""
    
    var body: some View {
        TextField("Amount", text: $value)
            .onChange(of: value) {
                print("changed")
                print(value)
            }
    }
}


上面的代码正确地控制台记录了这一点:

changed
2
changed


我认为问题在于,如果绑定变量是Double,则空的TextField被视为0。但我仍然认为应该调用.onChange。当用户删除所有字符时,如何通知我?

fhg3lkii

fhg3lkii1#

使用onChange无法检测到这一点,因为value不会 * 更改 *。当文本字段变为空时,解析失败,因此value不会更改。
您可以使用可选的Double,即Double?来检测文本何时从可解析变为不可解析,反之亦然:

@State var value: Double?

var body: some View {
    TextField("Amount", value: $value, format: .number)
        .keyboardType(.decimalPad)
        .onChange(of: value) {
            print("changed")
            if let value {
                print(value)
            }
        }
}

字符串
例如,文本字段最初为空,您输入“1”,onChange将被调用(value从nil变为1)。删除“1”也将导致onChange被调用(value从1变为nil)。
但是,这并不能检测到所有的文本变化。例如,当文本从A变为B时,onChange不会被调用,因为这两个文本都是不可解析的,而value保持不变(nil)。
如果你想检测 * 每一个 * 文本的变化,你需要 * 使用一个String。仍然可以有一个Double属性。你可以把它写为一个计算属性,解析String的状态。

var value: Double? {
    try? FloatingPointFormatStyle.number.parseStrategy.parse(text)
}

@State var text: String = ""

var body: some View {
    TextField("Amount", text: $text)
        .keyboardType(.decimalPad)
        .onChange(of: text) {
            print("changed")
            if let value {
                print(value)
            }
        }
}

相关问题