识别具有双精度值的SwiftUI Textfield中的更改 [英] Recognize changes in SwiftUI TextField with double value
本文介绍了识别具有双精度值的SwiftUI Textfield中的更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用Textfield让用户为某物添加价格。为了防止用户将其他值添加为数字,我将键盘类型更改为.decimalPad
。
stringValue
通过每次字符更改时的绑定正确更新。我现在的问题是,doubleValue
只有在用户按Enter键提交时才会更新。遗憾的是,小数键盘没有Enter键来提交输入。因此,当我尝试在不按Enter键的情况下将值保存到核心数据对象时,0将被保存为文本字段中的可视值(例如17.12)。对于现在的测试,我将使用另一个带有Enter按钮的键盘类型,但对于生产,需要以某种方式修复这个问题。
你有什么想法可以解决这个问题吗?下面是显示问题的最小化示例代码。
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
进行初始设置后,我输入了2
,然后输入了3
。显示的值是2.03
,这确实不是我想要的。也许我可以加强您的提示的方法。
推荐答案
我也遇到过类似的问题。这是我实现的解决方案,因为如果输入的值不是字符串,则无法检测到它。其思想是将值作为字符串,然后在进一步处理该值之前将其转换为Double。如果传递的是双精度值,则需要在将其绑定到Textfield之前将其转换为字符串。
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") }
}
}
这篇关于识别具有双精度值的SwiftUI Textfield中的更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文