使用状态变量更新计算属性

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/…

以上是关于使用状态变量更新计算属性的主要内容,如果未能解决你的问题,请参考以下文章

计算属性不更新不同选项卡中的 UI

SwiftUI 计算属性显示“在视图更新期间修改状态,这将导致未定义的行为。”错误

计算机图形学_图元的属性_1_OpenGL状态变量

计算机图形学_图元的属性_1_OpenGL状态变量

VueJS 计算属性未在 DOM 上更新

java并发编程实战笔记