识别具有双精度值的SwiftUI Textfield中的更改 [英] Recognize changes in SwiftUI TextField with double value

查看:18
本文介绍了识别具有双精度值的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆