[英]Changing @State variable to value from UserDefaults on load not updating Picker
[英]Storing Picker value to UserDefaults
我想將用戶對當前語言的選擇存儲到 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
}
}
然后在我的 model class 中:
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 加載所選語言並更新?
這是一種可能的方式(您可以根據需要選擇存儲/恢復的值)
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
屬性包裝器。
我會簡單地做:
import SwiftUI
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
@AppStorage("currentLanguage") var currentLanguage: Language = Language.en
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.