SwiftUI选择器与Firebase:初始化程序'init(:)'要求''符合'StringProtocol'

3
我有一段代码,想要将Firestore的数据放入一个选择器(picker)中。我之前已经实现了将Firestore数据显示在选择器中,但是我无法选择它以在“选定视图”中显示,因此我重写了代码,并出现了以下错误“Initializer 'init(_:)' requires that 'getSchoolData' conform to 'StringProtocol' "

请谅解这可能听起来像一个愚蠢的问题,我只是似乎无法解决它。我的代码副本如下所示。我已经尝试了几周,但还是束手无策,请对我友善一点,我是编程新手。

提前感谢,

import SwiftUI
import Firebase

struct SchoolDetailsView: View {
    
    let schoolData = [getSchoolData()]
    @State var selectedSchool = 0

    var body: some View {
        VStack {
            Form {
                Section {
                    Picker(selection: $selectedSchool, label: Text("School Name")) {
                        ForEach(0 ..< schoolData.count) {
                            Text(self.schoolData[$0])

                        }
                    }
                    Text("Selected School: \(selectedSchool)")
                }
            }.navigationBarTitle("Select your school")

        }
    }
}

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
}

你想做什么?打印schoolData中每个schoolNamename吗? - George
似乎你在上周就已经有一个工作版本,来自于你之前的问题 - George
嗨George,谢谢回复,是的。我想在选择器中打印来自Firebase的名称,然后将其传递到选择器的主视图中。我曾经搞定过这个问题,但无法进行任何选择,因此数据无法通过。 - LMA
1个回答

1
您可以尝试以下操作:

struct SchoolDetailsView: View {
    @ObservedObject var schoolData = getSchoolData() // make `@ObservedObject`/`@StateObject` instead of const array
    @State var selectedSchool = "" // `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) { // choose whether you want to tag by `id` or by `name`
                            Text($0.name)
                        }
                    }
                    Text("Selected School: \(selectedSchool)")
                }
            }.navigationBarTitle("Select your school")
        }
    }
}

你真是个传奇!我已经尝试了很久!它编译并运行了,现在我会看看我哪里出错了!再次感谢你! - LMA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接