我寻找解决这个问题的好方法,但我发现的任何问题都不能满足我的需求。我正在为此苦苦挣扎。
我需要的是一个
TextField
,它只接受格式为0123456789.
的%.2f
,并且不需要按回车键来提交。接收值为 Double
并返回为 Double
。
结果应该是
123.45
或 1.23
。
我的尝试:
var title: String
let numberFormatter = NumberFormatter()
@Binding var value: Double
var amountProxy: Binding<String> {
Binding<String>(
get: { String(format: "%.2f", value) },
set: {
if let value = numberFormatter.number(from: $0) {
self.value = value.doubleValue
}
}
)
}
var body: some View{
HStack(spacing: 8){
Text(LocalizedStringKey(title + ":"))
.layoutPriority(1)
TextField(LocalizedStringKey(""), text: amountProxy)
.keyboardType(.decimalPad)
.multilineTextAlignment(.trailing)
}
.lineLimit(1)
}
此方法的结果是强制用户输入一个数字并精确移动到小数点后以获得所需的值
4.20
。比如打字、移动、重复。用户体验非常差。
从 iOS17 开始,您可以使用以下功能:
.onChange(of: text, { oldValue, newValue in
if newValue != "" && Double(newValue) == nil {
text = oldValue
}
})