在键盘上键入会按预期触发.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
。当用户删除所有字符时,如何通知我?
1条答案
按热度按时间fhg3lkii1#
使用
onChange
无法检测到这一点,因为value
不会 * 更改 *。当文本字段变为空时,解析失败,因此value
不会更改。您可以使用可选的
Double
,即Double?
来检测文本何时从可解析变为不可解析,反之亦然:字符串
例如,文本字段最初为空,您输入“1”,
onChange
将被调用(value
从nil变为1)。删除“1”也将导致onChange
被调用(value
从1变为nil)。但是,这并不能检测到所有的文本变化。例如,当文本从
A
变为B
时,onChange
不会被调用,因为这两个文本都是不可解析的,而value
保持不变(nil)。如果你想检测 * 每一个 * 文本的变化,你需要 * 使用一个
String
。仍然可以有一个Double
属性。你可以把它写为一个计算属性,解析String
的状态。型