Почему я не могу отобразить данные из базы данных Firebase Realtime в UITableView? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь получить свои данные из базы данных Firebase Realtime, однако эти данные не отображаются в моем UITableView. Я извлекаю данные и пытаюсь добавить их в массив, который имеет тип созданной мною модели данных под названием Party. Я не уверен, как настроить свой код, чтобы я мог успешно получить данные из Firebase на мой UITableView, и я также не уверен, в чем проблема.

Я пытался изменить код и использовать разные методы для извлечения данных из Firebase, но ничего не получалось. Я создал массив с именем party, в котором хранится информация типа Party.

Ниже приведен мой код для функции переопределения UITableViewController. Вот где покоится большая часть кода для моей базы данных Firebase. Это табличное представление с пользовательскими ячейками.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Set the Firebase reference.
        ref = Database.database().reference()

        // Retrieve the parties and listen for changes.
        ref?.child("parties").observeSingleEvent(of: .value, with: { (snapshot) in
            // Take the value from the snapshot and add it to the parties array.
            let value = snapshot.value as? NSDictionary
            let titleText = value?["titleText"] as? String ?? "Title"
            let dateText = value?["dateText"] as? String ?? "Date"
            let timeText = value?["timeText"] as? String ?? "Time"

            self.parties.append(Party(title: titleText, date: dateText, time: timeText))
        })

        tableView.reloadData()

        guard let cell = tableView.dequeueReusableCell(withIdentifier: "YourPartiesTableViewCell", for: indexPath) as? YourPartiesTableViewCell else {
            fatalError("The dequeued cell is not an instance of YourPartiesTableViewController")
        }

        let party = parties[indexPath.row]

        // Configure the cell
        cell.titleLabel.text = party.titleText
        cell.dateAndTimeLabel.text = "\(party.dateText) at \(party.timeText)"
        cell.inviationsLabel.text = "0 people"
        cell.view.layer.cornerRadius = 15

        return cell
    }

Я ожидал, что он добавит данные из Firebase в массив сторон. Затем я хотел, чтобы эти данные отображались в табличном представлении. Почему этого не происходит? Где я ошибаюсь в своем коде?

1 Ответ

1 голос
/ 14 мая 2019

Вы не должны загружать какие-либо данные внутри cellForRowAt, так как они вызываются для каждого экземпляра в массиве dataSource, и удалять reloadData также, поскольку это не вызывает рекурсивных вызовов

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return parties.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {  
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "YourPartiesTableViewCell", for: indexPath) as? YourPartiesTableViewCell else {
            fatalError("The dequeued cell is not an instance of YourPartiesTableViewController")
        }

        let party = parties[indexPath.row]

        // Configure the cell
        cell.titleLabel.text = party.titleText
        cell.dateAndTimeLabel.text = "\(party.dateText) at \(party.timeText)"
        cell.inviationsLabel.text = "0 people"
        cell.view.layer.cornerRadius = 15

        return cell
    }
func loadData() {

    // Set the Firebase reference.
    ref = Database.database().reference() 
    // Retrieve the parties and listen for changes.
    ref?.child("parties").observeSingleEvent(of: .value, with: { (snapshot) in
        // Take the value from the snapshot and add it to the parties array.
        let value = snapshot.value as? NSDictionary
        let titleText = value?["titleText"] as? String ?? "Title"
        let dateText = value?["dateText"] as? String ?? "Date"
        let timeText = value?["timeText"] as? String ?? "Time" 
        self.parties.append(Party(title: titleText, date: dateText, time: timeText)) 
        self.tableView.reloadData()
    }) 

 }

Вызов loadData из viewDidLoad

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