我正在使用 TextField 让用户添加某物的价格。为了防止用户添加其他值作为数字,我将键盘类型更改为.decimalPad
.
The stringValue
每次角色更改时都会正确更新绑定。我现在的问题是doubleValue
仅当用户按下回车键提交时才更新。不幸的是,小数点键盘没有回车键来提交输入。因此,当我尝试在不按 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。
Edit belonging to asperis comment:
Your shared solution looks quite good, but as you can see in the screenshot it works not really correct:
初始设置值后0
我输入了一个2
然后一个3
。显示值为2.03
这确实不是我想要的。也许我可以增强你的提示方法。
我有类似的问题。这是我实现的解决方案,因为如果不是字符串,则无法检测键入的值。这个想法是将值作为字符串,然后在进一步处理该值之前将其转换为 Double。如果您传递 Double 值,则需要在将其绑定到 TextField 之前将其转换为 String。
struct SomeTextField: View {
@State var string: String = ""
@State var double: Double = 0.0
func save() {
double = Double(string)!
}
var body: some View {
VStack {
Text("String: \(string) Double: \(String(double))")
TextField("0.00", text: $string).keyboardType(.decimalPad)
Button(action: save) { Text("Save") }
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)