我正在使用 TextField 让用户为某物添加价格。为了防止用户将其他值添加为数字,我将键盘类型更改为.decimalPad.
使用stringValue每个字符更改的绑定更新正确。我现在的问题是,doubleValue只有在用户按 Enter 提交时才会更新。不幸的是,小数点没有输入键来提交输入。因此,当我尝试将值保存到我的核心数据对象而不按 Enter 时,会保存 0 而不是文本字段中的可见值(例如 17.12)。现在为了测试,我将使用另一种带有输入按钮的键盘类型,但对于生产,这需要以某种方式修复。
你有什么想法可以解决这个问题吗?下面是一个最小化的示例代码来显示问题。
struct ContentView: View {
@State private var doubleValue: Double = 0.0
@State private var stringValue = "Test"
private let numberFormatter: NumberFormatter = {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
return numberFormatter
}()
var body: some View {
Form {
TextField("", text: $stringValue)
.disableAutocorrection(true)
HStack {
Text("Price")
Spacer()
TextField("", value: $doubleValue, formatter: numberFormatter)
.fixedSize()
.keyboardType(.decimalPad)
}
// show live value changes
Text("\(stringValue)")
Text("Value: \(doubleValue)")
}
.padding()
}
func saveToCoreData() {
// save values into core data
}
}
我正在使用 Xcode 12.2 和 MacOS BigSur 11.0.1。
属于 asperis 评论的编辑:您共享的解决方案看起来相当不错,但正如您在屏幕截图中看到的那样,它的工作原理并不正确:

在使用值进行初始设置后,0我输入了 a 2,然后输入了 a 3。显示的值2.03确实不是我想要的。也许我可以加强你提示的方法。