Обновление ошибок просмотра при изменении данных в Firebase - PullRequest
0 голосов
/ 20 марта 2020

Это когда я запускаю приложение, и оно выглядит нормально Это когда я изменяю некоторые данные из Firebase, так как вы можете видеть, что некоторые данные расположены неправильно, а некоторые прямоугольники double В настоящее время я работаю над этим проектом, в котором мне нужно прочитать данные из Firebase и обновить свои представления по изменениям. Каждый раз, когда мои данные изменяются в базе данных Firebase, мои представления странно выдаются из ошибок.

Это мой ученический класс

struct Student : Identifiable {
    var id : String
    var name : String
    var surname : String
    var isAbsent : Bool
    var isBathroom : Bool
}

Здесь я получаю свои данные из firebase и публикую sh, чтобы получить все другие просмотры данных

class getStudents: ObservableObject {

    @Published var datas = [Student]()

    init() {
        let db = Firestore.firestore()
        let classRef = db.collection("5SA")

        classRef.order(by: "surname").addSnapshotListener {(snap,error) in
            if error != nil{
                print((error?.localizedDescription)!)
                return
            }


            for i in snap!.documentChanges{

                let id = i.document.documentID
                let name = i.document.get("name")as! String
                let surname = i.document.get("surname") as! String
                let isAbsent = i.document.get("absent") as! Bool
                let isBathroom = i.document.get("bathroom") as! Bool


                self.datas.append(Student(id: id, name: name, surname: surname, isAbsent: isAbsent, isBathroom: isBathroom))

              if i.type == .modified{
                    let isAbsent = i.document.get("absent") as! Bool
                    let isBathroom = i.document.get("bathroom") as! Bool
                    for j in 0..<self.datas.count{

                        if self.datas[j].id == id{

                            self.datas[j].isAbsent = isAbsent
                            self.datas[j].isBathroom = isBathroom
                        }
                    }
                }

            }

    }
}
}

Это мои взгляды. Помимо ландшафта на iPad симуляторе ошибок каждый раз. То, чего я пытаюсь достичь, - это создание классного приложения. Там, где ученики отсутствуют, в туалете или в подарок. Я хочу показать каждому студенту прямоугольник с его именем на нем и менять цвет прямоугольников каждый раз, когда изменяется bool на моей базе огня (isAbsent, isBathroom). Но когда я пытаюсь изменить значение в firebase, прямоугольники умножаются и делают странные мысли.

struct ContentView: View {

    @ObservedObject var students = getStudents()

    var body: some View {
        NavigationView{

            VStack{
                ScrollView{
                Text("Menu")
                Menu().background(Color.white)
                Text("Future verifiche")
                HStack{
                    ScrollView(.horizontal, showsIndicators: false){
                        RoundedRectangle(cornerRadius: 20).frame(width:300,height: 300).foregroundColor(.white).overlay(Text("V. Matematica"))
                    }
                }
                Text("Oggi")
                HStack{
                    Spacer()
                    Text("Assenti ")
                    Spacer()
                    Text("In bagno")
                    Spacer()
                    Text("Presenti")
                    Spacer()
                }
                HStack{
                    Spacer()

                    ScrollView{
                        ForEach(students.datas,id: \.id){student in
                            VStack(spacing: 15){
                                if student.isAbsent{
                                    RoundedRectangle(cornerRadius: 20).frame(width:200,height: 100).foregroundColor(self.getColor(isAbsent: student.isAbsent, isBathroom: student.isBathroom)).overlay(Text(student.name))
                                }
                            }
                        }
                    }
                    Spacer()
                    ScrollView{
                        ForEach(students.datas,id: \.id){student in
                            VStack(spacing: 15){
                                if student.isBathroom{
                                    RoundedRectangle(cornerRadius: 20).frame(width:200,height: 100).foregroundColor(self.getColor(isAbsent: student.isAbsent, isBathroom: student.isBathroom)).overlay(Text(student.name))
                                }
                            }
                        }
                    }
                    Spacer()
                    ScrollView{
                        ForEach(students.datas,id: \.id){student in
                            VStack(spacing: 15){
                                if !student.isAbsent && !student.isBathroom{
                                    RoundedRectangle(cornerRadius: 20).frame(width:200,height: 100).foregroundColor(self.getColor(isAbsent: student.isAbsent, isBathroom: student.isBathroom)).overlay(Text(student.name))
                                }
                            }
                        }
                    }
                    Spacer()
                }
            }
            }.navigationBarTitle("Classe 5SA",displayMode: .inline)
        }.navigationViewStyle(StackNavigationViewStyle())

    }
    func getColor(isAbsent: Bool, isBathroom : Bool) -> Color {
        if isAbsent{
            return Color.red
        }
        if isBathroom{
            return Color.blue
        }
        return Color.green
    }
}


struct Menu : View {

    var body : some View{
        HStack{
            NavigationLink(destination: Studenti()){

                RoundedRectangle(cornerRadius: 30).frame(width: 150,height: 150).foregroundColor(.red).opacity(0.5).overlay(Text("Studenti").foregroundColor(.black))

            }
            NavigationLink(destination: Text("Overview")){

            RoundedRectangle(cornerRadius: 30).frame(width: 150,height: 150).foregroundColor(.green).opacity(0.5).overlay(Text("Overview").foregroundColor(.black))

            }
            NavigationLink(destination: Text("Orario")){
            RoundedRectangle(cornerRadius: 30).frame(width: 150,height: 150).foregroundColor(.blue).opacity(0.5).overlay(Text("Orario").foregroundColor(.black))
            }

            NavigationLink(destination: Text("Calendario")){

            RoundedRectangle(cornerRadius: 30).frame(width: 150,height: 150).foregroundColor(.orange).opacity(0.5).overlay(Text("Calendario").foregroundColor(.black))

            }
        }
    }
}

struct Studenti : View {
    @ObservedObject var students = getStudents()
    var body : some View {
        ForEach(students.datas,id: \.id){student in
            VStack{
                Rectangle().frame(width:300,height: 150).foregroundColor(self.getColor(isAbsent: student.isAbsent, isBathroom: student.isBathroom)).overlay(Text(student.name))
            }
        }
    }
    func getColor(isAbsent: Bool, isBathroom : Bool) -> Color {
        if isAbsent{
            return Color.red
        }
        if isBathroom{
            return Color.blue
        }
        return Color.green
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...