繁体   English   中英

从 Picker 的 UserDefaults 中提取

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM