[英]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.