在 SwiftUI 中,我可以在“预览”中为货币等设置区域设置,但保留文本字段的通用格式,例如 Locale.current.currencyCode ??“英镑”

In SwiftUI can I set a locale in Preview for currency etc. but keep generic format for text fields eg Locale.current.currencyCode ?? "GBP"

提问人:Archie 提问时间:9/27/2023 更新时间:9/27/2023 访问量:54

问:

Xcode 版本 15.0 设置为 iOS 15.0 正如标题所说,我的应用程序使用 Text(someAmount, format: Locale.current.currencyCode ??“GBP”) 显示货币数量,其符号应根据每个用户区域设置而更改。但是,在预览中,我得到了$,并且找不到仅用于预览的特定区域设置的方法。

我找到了一些示例代码,我必须稍微修改一下才能使其运行,但这会更改非预览代码并且是固定数量。

// App.swift file

import SwiftUI

@main
struct Locale_TestApp: App {
    @StateObject var someCurrency = Currency()
    var body: some Scene {
        WindowGroup {
            ContentView(currency: someCurrency)
        }
    }
}

// ContentView code.

import SwiftUI

class Currency: ObservableObject {
    let currencyValue: Double = 123.45
    
    func getFormattedCurrency(for locale: Locale) -> String{
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.locale = locale
        let formatterCurrency =  formatter.string(for: self.currencyValue) ?? "?"
        return formatterCurrency
    }
}

struct ContentView: View {
    @Environment(\.locale) var locale
    let currency: Currency
    var body: some View {
        Text(currency.getFormattedCurrency(for: locale)) // Prints £123.45 for en_GB
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(currency: Currency())
            .environment(\.locale, .init(identifier: "en_GB"))
            
    }
}

如果我只在预览中将 .environment(.locale, .init(identifier: “en_GB”)) 行添加到 ContentView() 中,则只会将 $ 更改为 US$。

是否可以将预览设置为特定的区域设置,而保持“正常”代码不变?

SwiftUI 区域设置 货币 预览

评论

0赞 bennyyy999 9/27/2023
我认为这在预览中是不可能的,您可以做的是在预览设备设置中将模拟器设备设置为英国地区(就像使用普通 iPhone 一样)
0赞 Archie 9/27/2023
我没想到那个谢谢。它做了我想要的。

答:

0赞 malhal 9/27/2023 #1
struct ContentView: View {
    @Environment(\.locale) var locale
    let currencyValue = 123.45

    var body: some View {
        Text(currencyValue, format: .currency(code: locale.currency?.identifier ?? "USD")
    }
}

仅供参考,用于异步合并管道,您可能不需要它。@StateObject

评论

0赞 Archie 9/27/2023
好的,谢谢你。那时,我只是想得到编译器乐于编译的东西。我可以通过模拟器中的设置做我想做的事。