【问题标题】:SwiftUI - Picker value not changing when accessing data from UserDefaultsSwiftUI - 从 UserDefaults 访问数据时选择器值不会改变
【发布时间】:2021-03-28 04:36:59
【问题描述】:

我正在制作一个应用程序,在该应用程序中,我根据选择器的用户选择显示不同的视图。选择器的绑定值最初由 ViewModel 中的 UserDefaults 设置。问题是当我在我的应用程序中选择一个选择器值时,选择器会自动返回初始状态,就好像有人强制选择器而不是更改值一样。

设置视图模型:

import Foundation

class SettingsViewModel:ObservableObject{
    @Published var showSettings = false
    //Here is the problem
    @Published var choosenUserType = UserDefaults.standard.string(forKey: "userType"){
        didSet{
            UserDefaults.standard.set(self.choosenUserType, forKey: "userType")
        }
    }
    
    
    static var userTypes = ["Client", "Worker"]
}

主页视图:

import SwiftUI

struct HomeView: View {
    @StateObject var settingsVM = SettingsViewModel()
    var body: some View {
        VStack{
            switch settingsVM.choosenUserType{
            case "Client":
                Text("This is client")
            case "Worker":
                Text("This is worker")
            default:
                Text("This is default")
            }
        }.navigationTitle("Tanvirgeek Co")
        .navigationBarItems(trailing: Button(action: {
            settingsVM.showSettings.toggle()
        }, label: {
            Text("Settings")
        }))
        .sheet(isPresented: $settingsVM.showSettings, content: {
            SettingsView(dissmiss: $settingsVM.showSettings)
                .environmentObject(settingsVM)
        })
        
    }
}

设置视图:

import SwiftUI

struct SettingsView: View {
    @EnvironmentObject var settingVM:SettingsViewModel
    @Binding var dissmiss:Bool
    var body: some View {
        VStack{
            
            Picker(selection: $settingVM.choosenUserType, label: Text("Choose User Type"), content: {
                ForEach(SettingsViewModel.userTypes, id: \.self) { userType in
                    Text("\(userType)")
                }
            })
            
            Button(action: {
                dissmiss.toggle()
            }, label: {
                Text("Dismiss")
            })
        }
    }
}

我做错了什么?这里如何通过picker的值改变picker的绑定变量值?

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    您的choosenUserType 最终会得到推断类型的String?,因为这是UserDefaults.string(forKey:) 返回的内容。

    Picker 的选择类型需要与标签类型完全匹配。标签(在这种情况下也是推断出来的)的类型为String

    我通过为choosenUserType 提供默认值解决了这个问题,这样它就可以是String(而不是String?):

    class SettingsViewModel:ObservableObject{
        @Published var showSettings = false
        @Published var choosenUserType : String = UserDefaults.standard.string(forKey: "userType") ?? SettingsViewModel.userTypes[0] {
            didSet{
                UserDefaults.standard.set(self.choosenUserType, forKey: "userType")
            }
        }
        static var userTypes = ["Client", "Worker"]
    }
    

    另外,在您的SettingsView 中,您不必在Text 中插入userType - 您可以直接提供它:

    struct SettingsView: View {
        @EnvironmentObject var settingVM:SettingsViewModel
        @Binding var dissmiss:Bool
        var body: some View {
            VStack{
                Picker(selection: $settingVM.choosenUserType, label: Text("Choose User Type")) {
                    ForEach(SettingsViewModel.userTypes, id: \.self) { userType in
                        Text(userType)
                    }
                }
                Button(action: {
                    dissmiss.toggle()
                }, label: {
                    Text("Dismiss")
                })
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2020-04-03
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多