当前位置: 首页 > 知识库问答 >
问题:

将选取器值存储为UserDefaults

燕砚文
2023-03-14

我想将用户对当前语言的选择存储到UserDefaults。用户通过选择器选择他们喜欢的语言。然而,我不知道如何放置代码来更新UserDefaults。

下面是我的代码:

enum Language: Int, CaseIterable, Identifiable {
    case en
    case zh_hant
    
    var description: String {
        switch self {
        case.en:
            return "English"
        case.zh_hant:
            return "繁體中文"
        }
    }
    
    var id: Int {
        self.rawValue
    }
}

然后在我的模型课上:

final class ModelData: ObservableObject {
    // this is to be used as the default when the app is first launch.
    // However, if the user choose the language, the default should be retrieve from UserDefaults
    @Published var currentLanguage: Language = Language.en
}

和选择语言的用户界面:

struct ConfigurationView: View {
    
    @EnvironmentObject var modelData: ModelData
    
    let lang_title = ["Language", "語言"]

    var body: some View {
        List {
            VStack {
                HStack {
                    Text(lang_title[modelData.currentLanguage.rawValue]).font(.title2)
                    Spacer()
                }
                Picker("Language", selection: $modelData.currentLanguage) {
                    ForEach(Language.allCases, id: \.id) { language in
                        Text(language.description).tag(language)
                    }
                }
                .pickerStyle(SegmentedPickerStyle())
            }
            .padding()
        }

    }
}

我如何从UserDefaults加载所选语言并更新用户?

共有2个答案

范金鑫
2023-03-14

您需要用相同的值重新设置它

谷弘致
2023-03-14

这里有一个可能的方法(存储/还原的值可以根据需要选择)

    Picker("Language", selection: $modelData.currentLanguage) {
        ForEach(Language.allCases, id: \.id) { language in
            Text(language.description).tag(language)
        }
    }
    .pickerStyle(SegmentedPickerStyle())
    .onChange(of: modelData.currentLanguage) {
        UserDefaults.standard.setValue($0.rawValue, forKey: "language")
    }

和创建(或在init中(如果需要一些解码))

final class ModelData: ObservableObject {
    @Published var currentLanguage = Language(rawValue: UserDefaults.standard.value(forKey: "language") as? Int ?? 0)!
}

另外,您可以在ConfigurationView视图中考虑AppStorage属性包装。

 类似资料:
  • 问题内容: 我已经看过所有类似的线程,阅读了文档,并尝试了许多组合来将空值存储在db中,并且每次都失败。 我正在使用MySQL。 我定义了一个字段。我从csv文件填充db,并且某些单元格没有值。Django文档说: 由于我正在与我一起工作,因此我希望将一个空字符串(csv中的一个空单元格)存储在db中。因此,我(认为)必须添加到该字段中。实际上,我已经尝试了更多: 每次我向数据库插入一个空字符串时

  • 现在针对ABC键的值应该是复杂对象的列表。但当我真的得到“学校::abc” 我用奇怪的字符得到的值如下: \xac\xed\x00\x05SR\x00\x13java.util.arraylistx\x81\xD2\x1D\x99\xC7A\x9D\x03\x00\x01I\x00\x04Sizexp\x00\x00\x00\x01W\x04\x00\x00\x00\x01SR\x00(com.e

  • 问题内容: 在我的应用程序中,我得到了带有描述性预定义标签的“文章”(类似于帖子/推文/文章):即“困难”,“简单”,“红色”,“蓝色”,“业务”等 这些可用标签存储在一个表中,称为包含所有可用标签的“标签”。 每篇文章都可以使用多个标签进行标记,这些标签可以通过自定义管理界面进行编辑。 可能很容易将每个实体的标签捆绑到每个标签ID的字符串化数组中,并将其与文章记录一起存储在我的“文章”表中: 尽

  • 这是我的JSON文件,我需要从key:value pair中获取值,然后将这些值存储到ArrayList rating中进行排序,但使用这段代码,我只得到“reviews”作为键...你能帮我吗?我知道要得到所有的关键:值对,但我只需要一对,并从中取值。我应该为每个人使用迭代器吗?你能给我一些方向和例子吗

  • 我正试图从本地Spark集群将Spark DataFrame存储为Azure Blob存储中的CSV 首先,我用Azure Account/Account键设置配置(我不确定什么是正确的配置,所以我已经设置了所有这些) 似乎这个问题已经在数据库论坛上报告了!! 在Azure Blob上存储DataFrame的正确方法是什么?

  • 我需要只使用%RAX、%RBX、%RCX、%RDX、%RSI和%RDI(还有%RSP和%RBP)编写像素化汇编代码 GCC编写的程序集代码: 已将%dl更改为%rdx: