簡體   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