SwiftUI TextField 中的货币输入

Posted

技术标签:

【中文标题】SwiftUI TextField 中的货币输入【英文标题】:Currency input in SwiftUI 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 类型。

【问题讨论】:

【参考方案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)

以上是关于SwiftUI TextField 中的货币输入的主要内容,如果未能解决你的问题,请参考以下文章

使用 SwiftUI 中活动 TextField 中的值更新非活动 TextField

为啥导航栏中的 SwiftUI TextField 一次只接受输入一个字符

SwiftUI for MacOS 中的多行 TextField/TextEditor 表单

UIPickerView 作为 SwiftUI 中 TextField() 的输入

在 TextField 中的空格后自动触发 shift 按钮 - SwiftUI

SwiftUI - 在 ForEach 中获取 TextField 数组