【问题标题】:Storing a selected value from picker to use in other views - SwiftUI存储选择器中的选定值以在其他视图中使用 - SwiftUI
【发布时间】:2021-02-12 10:20:19
【问题描述】:

我非常友好地帮助我让我的选择器从我的 Firestore 数据库中选择一个值。我想做的是,一旦在我的选择器中选择了该值,我希望能够在其他视图中显示该值。我曾尝试使用 UserDefaults 进行设置,但我不确定这是要走的路吗?如果您能提出更好的方法,我将不胜感激。我的代码目前如下。

下面代码中的值每次都返回 Unknown School,但没有用户默认值,在获取数据时可以完美地工作。

提前致谢。

import SwiftUI
import Firebase

struct SchoolDetailsView: View {
    @ObservedObject var schoolData = getSchoolData()
    @State private var selectedSchool = UserDefaults.standard.string(forKey: "") // `schoolName.id` is of type String

    var body: some View {
        VStack {
                Form {
                    Section {
                        Picker(selection: $selectedSchool, label: Text("School Name")) {
                            ForEach(schoolData.datas, id: \.id) {
                                Text($0.name)
                            }
                        }
                        Text("Selected School: \(selectedSchool ?? "Unknown School")")
                    }
                }.navigationBarTitle("School Selection")
            }
        }

struct SchoolPicker_Previews: PreviewProvider {
    static var previews: some View {
        SchoolDetailsView()
    }
}

class getSchoolData : ObservableObject{
    
    @Published var datas = [schoolName]()
    
    init() {
        
        let db = Firestore.firestore()
        
        db.collection("School Name").addSnapshotListener { (snap, err) in
            
            if err != nil{
                
                print((err?.localizedDescription)!)
                return
            }
            
            for i in snap!.documentChanges{
                
                let id = i.document.documentID
                let name = i.document.get("Name") as! String
                
                self.datas.append(schoolName(id: id, name: name))
            }
        }
    }
}

struct schoolName : Identifiable {
    
    var id : String
    var name : String
}
}

【问题讨论】:

    标签: google-cloud-firestore swiftui picker


    【解决方案1】:

    首先,变量的 UserDefaults 键不能为空:

    @State private var selectedSchool: String = UserDefaults.standard.string(forKey: "selectedSchool") ?? "Unknown School"
    

    那么你可以使用onReceive来更新变量:

    .onReceive(Just(selectedSchool)) {
        UserDefaults.standard.set($0, forKey: "selectedSchool")
    }
    

    完整代码:

    import Combine
    import Firebase
    import SwiftUI
    
    struct SchoolDetailsView: View {
        @ObservedObject var schoolData = getSchoolData()
        @State private var selectedSchool = UserDefaults.standard.string(forKey: "selectedSchool")
    
        var body: some View {
            VStack {
                Form {
                    Section {
                        Picker(selection: $selectedSchool, label: Text("School Name")) {
                            ForEach(schoolData.datas, id: \.id) {
                                Text($0.name)
                            }
                        }
                        .onReceive(Just(selectedSchool)) {
                            UserDefaults.standard.set($0, forKey: "selectedSchool")
                        }
                        Text("Selected School: \(selectedSchool)")
                    }
                }.navigationBarTitle("School Selection")
            }
        }
    }
    

    请注意,在 SwiftUI 2 / iOS 14 中,您可以改用 @AppStorage

    【讨论】:

    • 您好 Pawello,一如既往地感谢您的更新。我试过很高兴我是在正确的路线上。我曾尝试在没有空键的情况下使用它,但它似乎不起作用,但现在我明白了为什么这么感谢。尽管该代码可以正确编译。它似乎不再让我选择学校。选择的学校不会从零“未知学校”改变
    • @LMA 是的,selectedSchool 也必须是 String 类型(schoolName.id 也是如此)。我更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多