[英]Pulling from UserDefaults for a Picker
我覺得我一定是在做一些愚蠢的事情。 如果從 UserDefaults 中拉出以設置 Picker 值,然后在 Picker 更改時保存到 UserDefaults,我將嘗試做的所有事情。 當我嘗試使代碼適用於 iOS14 和 15 時,我遇到了這個問題。
struct SettingsView: View {
@State var rangeSelection: Int = UserDefaults.standard.integer(forKey: "vocalRange")
@State var rangeOptions = ["Soprano", "Mezzo-Soprano/Alto", "Extended Range"]
var body: some View {
VStack{
Form {
Section {
Picker(selection: $rangeSelection, label: Text("Range")) {
ForEach(0 ..< rangeOptions.count, id: \.self) { range in
Text(rangeOptions[range])
.tag(range)
}
}
.onChange(of: rangeSelection, perform: { value in
UserDefaults.standard.setValue(rangeSelection, forKey: "vocalRange")
})
}
}
}
.navigationTitle("Settings")
.navigationBarTitleDisplayMode(.inline)
}
}
這似乎工作正常,並且“onChange”觸發得很好。 唯一奇怪的是,如果您離開頁面並立即返回 go,“rangeSelection”變量將重置為原來的值。 但是,一旦您重新啟動應用程序,更改就會正確反映出來。
作為替代方案,我嘗試了以下
@State var rangeSelection: Int = 0
...
.onAppear(perform:{
rangeSelection = UserDefaults.standard.integer(forKey: "vocalRange")
})
這就產生了另一個有趣的問題。 在 iOS15 中它工作正常,但在 iOS14 中,一旦你改變了選擇器,OnAppear 在 OnChange 之前觸發,並將選擇器恢復到它以前的值。 這只會發生,因為我在表單/列表中使用選擇器,所以當您 select 選擇器時它會更改頁面。
我覺得我應該使用一個明顯的解決方案。
你可以設置 delay in.OnAppear 方法來工作它
.onAppear(perform:{
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
rangeSelection = UserDefaults.standard.integer(forKey: "vocalRange")
}
})
感謝@loremipsum 我使用了 AppStorage。 我這樣聲明變量,不需要“onChange”!
@AppStorage("vocalRange") var rangeSelection: Int = UserDefaults.standard.integer(forKey: "vocalRange")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.