Как заполнить данные в UIPickerView из базы данных Firebase - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь заполнить данные базы данных Firebase в UIPickerView.По сути, я хочу, чтобы «Тема» была указана в окне выбора, чтобы пользователь мог выбрать тему и щелкнуть кнопку выбора.Я приложил приведенный ниже код, который сейчас использую, но, похоже, он не работает.Любая помощь будет принята с благодарностью!

class VoteDetailVC: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    var TPNumber = ""
    var intake = ""
    var module = ""
    var status = ""

    var topicSelected = ""

    var topics = [String]()
    @IBOutlet weak var pickerView: UIPickerView!
    @IBOutlet weak var lblClose: UILabel!
    @IBOutlet weak var lblOpen: UILabel!
    var ref:DatabaseReference!

    @IBOutlet weak var btnVote: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        ref = Database.database().reference()
        pickerView.delegate = self
        pickerView.dataSource = self
        if (status == "Open") {
            lblOpen.isHidden = false
            pickerView.isHidden = false
            btnVote.isHidden = false

            ref.child("Attendance").observeSingleEvent(of: .value, with: { (snapshot) in
                for child in snapshot.children.allObjects as! [DataSnapshot] {
                    let value = child.key // All AIDs.
                    self.ref.child("Attendance").child(value).child("Intake").observe(.value, with: {(snapshot) in
                        for child1 in snapshot.children.allObjects as! [DataSnapshot] {
                            let value1 = child1.key
                            print(value1) //Number of intake
                            self.ref.child("Attendance").child(value).child("Intake").child(value1).observe(.value, with: {(snapshot) in
                                if let value2 = snapshot.value as? String { // Intakes for attendance
                                    if (self.intake == value2) { //if Matches student intake
                                        self.ref.child("Attendance").child(value).child("Module").observe(.value, with: {(snapshot) in
                                            if let getModule = snapshot.value as? String {
                                                if (getModule == self.module) { self.ref.child("Attendance").child(value).child("Topic").observe(.value, with: {(snapshot) in
                                                    if let topic = snapshot.value as? String {
                                                        self.topics.append(topic)
                                                    }
                                                    print(self.topics) // prints the correct array, exactly what I want in my pickerView.
                                                    })
                                                }
                                            }
                                        })
                                    }
                                }
                            })
                        }
                    })
                }
            })
        } else {
            lblClose.isHidden = false
        }
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return topics.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return topics[row]
    }

Структура базы данных Firebase

{
  "Attendance" : {
    "24-9-2019%20AAB%20OS%2010:35am" : {
      "Date" : "24-9-2019",
      "Duration" : "2hour",
      "Intake" : [ "UCDF1809ICT-DI-ITR-SE" ],
      "LecturerCode" : "AAB",
      "Module" : "OS",
      "Start" : "10:35am",
      "StudentsPresent" : 75,
      "Topic" : "Memory Management",
      "TotalStudents" : 89
    },
    "27-9-2019%20AAB%20OSCA%2002:00pm" : {
      "Date" : "27-9-2019",
      "Duration" : "2hour 30mins",
      "Intake" : [ "UC3F1902IT(MBT)" ],
      "LecturerCode" : "AAB",
      "Module" : "OSCA",
      "Start" : "02:00pm",
      "StudentsPresent" : 4,
      "Topic" : "New Attendance",
      "TotalStudents" : 5
    },
    "27-9-2019%20AAB%20OSCA%2008:30am" : {
      "Date" : "27-9-2019",
      "Duration" : "1hour",
      "Intake" : [ "UC3F1902IT(MBT)" ],
      "LecturerCode" : "AAB",
      "Module" : "OSCA",
      "Start" : "08:30am",
      "StudentsPresent" : 2,
      "Topic" : "Testing",
      "TotalStudents" : 5
    },

1 Ответ

0 голосов
/ 27 сентября 2019

Цель читается в темах из узла Attendance и заполняет источник данных, который поддерживает pickerView.

Я собираюсь дать полный ответ, поскольку он решит несколько проблем с кодом в вопросе.

Первое, на что нужно обратить внимание: после заполнения массива dataSource строками, которые отображаются в pickerView, что делать, если пользователь нажимает один, чтобы выбрать его?Как вы знаете, что это за тема?Что если две темы имеют одно и то же имя, но разные даты.

Вот как это решить:

Сначала мы начнем с LectureClass, в котором хранится ключ (идентификатор) лекции, а такжетема, дата и т. д. и т. д.

class LectureClass {
    var key = ""
    var topic = ""
    var date = ""

    init(withSnapshot: DataSnapshot) {
        self.key = withSnapshot.key
        self.topic = withSnapshot.childSnapshot(forPath: "topic").value as? String ?? "No Topic"
        self.date = withSnapshot.childSnapshot(forPath: "date").value as? String ?? "No Date"
    }
}

, затем массив dataSource для хранения всех тем

var lectureArray = [LectureClass]()

, затем код для чтения во всех темах, итерации по каждой теме и созданиеLectureClass из данных, хранящихся в каждом снимке.

func readLectures() {
    print(#function)
    let ref = self.ref.child("Attendance")
    ref.observeSingleEvent(of: .value, with: { snapshot in
        let allLectures = snapshot.children.allObjects as! [DataSnapshot]
        for lectureSnap in allLectures {
            let aLecture = LectureClass(withSnapshot: lectureSnap)
            self.lectureArray.append(aLecture)
        }
    })
    //reload your collection view here
}

после запуска этого кода источник данных будет содержать данные из Firebase и отображаться в collectionView.

Итак, когда пользователь нажимаетстрока, вы будете знать, какая строка и какая соответствует строке в источнике данных.Оттуда вы можете получить класс LectureClass и ключ к определенному узлу.

Как только еще одно важное замечание, вы должны изменить свою структуру.Теперь у вас есть

{
  "Attendance" : {
    "24-9-2019%20AAB%20OS%2010:35am" : {

, и с этим ключом будет очень сложно работать.Вам следует создать ключи Firebase с помощью .childByAutoId, а затем сделать строку "24-9-2019% 20AAB% 20OS% 2010: 35am" в качестве дочернего узла

{
   "Attendance" : {
       "lecture_0": //created with .childByAutoId
          topic: "Memory Management"
          date: "2019-09-24"
          whatever_this_is: "24-9-2019%20AAB%20OS%2010:35am"
       "lecture_1": {

также, пожалуйста, сохраняйте даты в сортируемомформат.Это не будет сортировать должным образом, если вам когда-либо понадобится сортировка

"Date" : "27-9-2019",

, сделайте это вместо

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