使用状态变量更新计算属性
Posted
技术标签:
【中文标题】使用状态变量更新计算属性【英文标题】:Update computed property with state variable 【发布时间】:2019-09-26 16:55:51 【问题描述】:我有以下情况:我正在创建一个Form
,用户可以在其中输入一个TextField
中的金额。此外,用户可以通过Picker
选择货币。金额的格式为NumberFormatter
,我想在用户更改货币时更新文本。
@State private var currencyCode = "EUR"
这是格式化程序:
private let currencyFormatter: NumberFormatter =
var formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyCode = $currencyCode // something like this, but that's not working!
return formatter
()
表格如下所示:
Form
Section
TextField("Enter a description", text: $reason)
TextField("Amount", value: $amount, formatter: currencyFormatter)
.keyboardType(.decimalPad)
Section
Picker(selection: $currencyCode, label: Text("Currency"))
ForEach(codes, id: \.self) code in
Text(code)
【问题讨论】:
那么,您只是想知道如何在从选择器中选择货币时更新文本? 基本上是的,但是文本取决于格式化的货币。所以格式化的货币代码需要从选择器中更改。 【参考方案1】:首先,您需要删除$
。 $currencyCode
给你一个Binding<String>
,但你想要的是值,而不是值的绑定。 (请参阅 this answer 我解释绑定的地方。)
其次,您要使用计算属性,因为您的数字格式化程序需要根据您选择的currencyCode
进行更改。把它放在你的视图结构中:
private var currencyFormatter: NumberFormatter
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyCode = currencyCode
return formatter
【讨论】:
好的,我明白了!谢谢你的解释。但是,每当我从Picker
中选择一个新值时,TextField
总是会重置我的输入。
好的,所以当我将默认值设置为@State private var amount: Double = 0.0
时它工作得非常好。但是,如果我将其设为可选,格式化程序将不起作用。
我假设你的意思是如果金额为零,格式化程序返回一个空白字符串?
只要我创建@State var amount: Double?
并输入一个值,一旦我选择了一个不同的Picker
值,它总是会被重置(空白文本字段)。此外,文本不会被格式化为货币字符串。
现在想通了,感谢您的帮助。我正在使用自定义@Binding
变量并将其设置为TextField
的文本,这个答案帮助我解决了这个***.com/questions/56799456/…以上是关于使用状态变量更新计算属性的主要内容,如果未能解决你的问题,请参考以下文章