【问题标题】:Currency input in SwiftUI TextFieldSwiftUI TextField 中的货币输入
【发布时间】:2019-07-30 19:46:45
【问题描述】:

我正在尝试实现在编辑模式详细视图中更改货币值的功能,但我正在努力获取格式化输入以使数值正常工作。

struct JobDetailView_Edit: View {

@State var jobDetails: JobDetails

var currencyFormatter: NumberFormatter = {
    let f = NumberFormatter()
    f.numberStyle = .currency
    return f
}()

var body: some View {
    Form {

                Section(header: Text("General")) {
                    HStack {
                        Text("Job Name")
                        Spacer()
                        TextField($jobDetails.jobName)
                            .multilineTextAlignment(.trailing)
                    }

                    TextField($jobDetails.hourlyRateBasic, formatter: currencyFormatter)

                }
... other unimportant code...

数据正确传入,文本字段显示存储在 $jobDetails.hourlyRateBasic 中的格式化值,但是,如果它是字符串,我无法编辑该字段。如果我尝试编辑该字段,然后在模拟器中按 Enter,我会收到以下错误消息:

[SwiftUI] Failure setting binding's value. The supplied formatter does not produce values of type Double. This may be resolved by ensuring the binding and the output of the formatter are of the same type.

仅供参考 $jobDetails.hourlyRateBasic 是 double 类型。

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    我创建了一个环绕 UITextfield 的组件。

    你可以在这里查看https://github.com/youjinp/SwiftUIKit

    这是演示

    【讨论】:

    • 得到了这个工作的纯 Swift (UIKit) 版本。谢谢你,@youjin
    • 太棒了-谢谢@youjin。 QQ。如何使用不为零的值对其进行初始化?
    • @LateNate 使用值初始化现在已在最新提交中修复。
    • 这很好,但需要以十进制工作以处理大型财务数字或具有较大价值的货币,例如。日元、印尼盾等
    【解决方案2】:

    Ben Scheirman 创建了一个小费计算器,它使用带有货币格式化程序的 TextField。他的代码和你的不同之处在于他将货币价值存储在一个 Double? 中。 NumberFormatter 返回一个 NSNumber?。

    你可以在https://github.com/nsscreencast/397-swiftui-tip-calculator看到他的代码

    【讨论】:

    • 更新到 Beta 5 似乎改变了 TextField 的工作方式,我已经解决了将 Double 更改为 Double 的问题? (今天早上在更新它之前工作。但是我知道当我的 TextField 调用是 TextField("", text: $basePay, formatter: currencyFormatter) 时出现错误 Cannot invoke initializer for type 'TextField<_>' with an argument list of type '(String, text: Binding<Double?>, formatter: NumberFormatter)' 。感谢答案。
    • 文档和Ben说初始化器是TextField("placeholder", value: $basePay, formatter: currencyFormatter)
    • 感谢您代表我的监督。
    • 这也越来越好。我从来没有用 Swift 或 SwiftUI 编写过代码,而且这种语言感觉很笨拙,文档也很差。感谢您提供帮助!
    • 您始终可以像这样为您的小数提供绑定:TextField("Amount", value: Binding<NSNumber>(get: { decimalValue as NSDecimalNumber }, set: { decimalValue = $0.decimalValue }), formatter: currencyFormatter)
    猜你喜欢
    • 2022-11-09
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多