Arhn - архитектура программирования

iOS: отображать данные firebase в tableView

Я пытаюсь отобразить данные из базы данных Firebase в свой tableView. Код работал с использованием «контроллера представления вкладок», но для целей проекта мне пришлось включить TableView в классический ViewController.

Вот код, который должен получить данные из базы данных, а затем включить их в табличное представление.

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase

class NewsfeedViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var ref:DatabaseReference!,
        posts = [eventStruct]()

    @IBOutlet weak var tableview: UITableView!

    struct eventStruct {
        let title: String!
        let date: String!
        let location: String!
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        loadNews()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func loadNews() {
        ref = Database.database().reference()
        ref.child("events").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in

            if let valueDictionary = snapshot.value as? [AnyHashable:String]
            {
                let title = valueDictionary["Title"]
                let location = valueDictionary["Location"]
                let date = valueDictionary["Date"]
                self.posts.insert(eventStruct(title: title, date: date, location: location), at: 0)
            }
        })
        self.tableview.reloadData()
    }

    //Table View Content
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return posts.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        let label1 = cell.viewWithTag(1) as! UILabel
        label1.text = posts[indexPath.row].title

        let label2 = cell.viewWithTag(2) as! UILabel
        label2.text = posts[indexPath.row].location

        let label3 = cell.viewWithTag(3) as! UILabel
        label3.text = posts[indexPath.row].date

        return cell
    }

}

Я не получаю никаких ошибок, но данные не отображаются в tableView.

Раньше мне приходилось использовать переопределение для каждой функции, управляющей табличным представлением. Если у меня нет переопределения, мне не следует вызывать эти функции где-то в коде, чтобы они работали? Спасибо.


Ответы:


1

Блок завершения observe вызовет асинхронный вызов, а ваш self.tableview.reloadData() выполнится до этого, поэтому вам нужно перезагрузить tableView внутри блока завершения после того, как вы вставите объект в массив.

func loadNews() {
    ref = Database.database().reference()
    ref.child("events").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in

        if let valueDictionary = snapshot.value as? [AnyHashable:String]
        {
            let title = valueDictionary["Title"]
            let location = valueDictionary["Location"]
            let date = valueDictionary["Date"]
            self.posts.insert(eventStruct(title: title, date: date, location: location), at: 0)
            //Reload your tableView
            self.tableview.reloadData()
        }
    })

}

Примечание. Также убедитесь, что ваши delegate и datasource в tableView подключены.

12.06.2017
  • Я уже пробовал это решение (это была исходная версия, которую я написал). К сожалению, это все еще не решает проблему. 12.06.2017
  • @VictorMihaita Вы отлаживаете свой код, если блок выполняется, если вы еще не отлаживали код, попробуйте отладить его и проверить, идет ли управление внутри, если блок или нет. 12.06.2017
  • Я только что это сделал. Массив получает правильные данные из базы данных, и я могу распечатать каждый его элемент. Я печатал его точно перед перезагрузкой tableView. Так что проблема только с отображением данных. 12.06.2017
  • @VictorMihaita Если установлен массив, проверьте, подключены ли delegate и datasource из tableView или нет. 12.06.2017
  • Спасибо за помощь! В этом была проблема. Я забыл подключить делегата и источник данных. Теперь все работает правильно. 12.06.2017
  • @VictorMihaita Добро пожаловать, приятель :) 12.06.2017
  • Сделанный! Спасибо еще раз. 12.06.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..