如何更改菜单的标签?

How to change the label of a Menu?

提问人:Alexander Farber 提问时间:6/12/2021 更新时间:6/12/2021 访问量:728

问:

Github 上的一个简单的测试项目中,我尝试显示一个包含 3 种语言的菜单和允许用户选择本地化的标志:

struct ContentView: View {
    // ...some Core Data related code skipped...
    
    let labels = [
        "en" : "🇺🇸 EN",
        "de" : "🇩🇪 DE",
        "ru" : "🇷🇺 RU"
    ]
    
    @AppStorage("language") var language:String = "en"

    var body: some View {
        VStack(alignment: .trailing) {

            Menu(language) {
                Button("🇺🇸 EN", action: { language = "en" })
                Button("🇩🇪 DE", action: { language = "de" })
                Button("🇷🇺 RU", action: { language = "ru" })
            }.padding()
            
            List {
                ForEach(topEntities) { top in
                    TopRow(topEntity: top)
                }
            }
        }.environment(\.locale, .init(identifier: language))
    }
}

上面的代码似乎工作正常,但有一个外观问题:菜单显示所选语言一个简单的字符串“en”(或“de”,或“ru”):

screenshot

作为 Swift 和 SwiftUI 新手,我不明白如何将标签设置为更好的字符串,即选定的语言和标志,例如“🇺🇸 EN”。请帮忙

本地化 swiftui-menu

评论


答:

2赞 George 6/12/2021 #1

你可以从字典中得到漂亮的字符串。这是工作版本:labels

Menu(labels[language] ?? "Unknown") {
    Button("🇺🇸 EN", action: { language = "en" })
    Button("🇩🇪 DE", action: { language = "de" })
    Button("🇷🇺 RU", action: { language = "ru" })
}.padding()

我只是用.languagelabels[language] ?? "Unknown"

评论

0赞 cedricbahirwe 6/12/2021
我认为从逻辑上讲,我们可以使用强制解包来确保你不会最终得到一种语言Menu(labels[language]!)unknown
1赞 George 6/12/2021
@cedricbahirwe 理想情况下,它永远不应该是未知的。但是,由于我们无法保证它,因为语言被设置为字符串(并且可以设置任何字符串),我认为这会更安全一些。