TableView не отображает данные из базы данных Firebase - PullRequest
0 голосов
/ 14 марта 2019

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

    import UIKit
import Firebase

struct postStruct {
    let word : String!
    let wordType : String!
}

class sentenceBuilderViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var wordSearchBar: UISearchBar!
    @IBOutlet weak var wordsTableView: UITableView!

    var posts = [postStruct]()
    override func viewDidLoad() {
        wordsTableView.reloadData()
        getWordsFromDatabase()
        super.viewDidLoad()
        wordsTableView.delegate = self
        wordsTableView.dataSource = self
    }

    func getWordsFromDatabase() {
        let databaseRef = Database.database().reference()
            databaseRef.child("wordList").queryOrderedByKey().observeSingleEvent(of: .childAdded, with: {
                snapshot in


                let word = (snapshot.value as? NSDictionary)!["word"] as? String
                let wordType = (snapshot.value as? NSDictionary
                    )!["wordType"] as? String
                self.posts.insert(postStruct(word: word, wordType: wordType), at: 0)

            })
        wordsTableView.reloadData()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return posts.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = wordsTableView.dequeueReusableCell(withIdentifier: "Cell")

        let wordLabel = cell?.viewWithTag(1) as! UILabel
        wordLabel.text = posts[indexPath.row].word

        let wordTypeLabel = cell?.viewWithTag(2) as! UILabel
        wordTypeLabel.text = posts[indexPath.row].wordType

        return cell!
    }

}

Любая помощь и вклад будут оценены! Спасибо!

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Проблема в том, что вы просто наблюдаете одно событие здесь:

databaseRef.child("wordList").queryOrderedByKey().observeSingleEvent(of: .childAdded, with: {
            snapshot in

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

 func getAllWordsFromDatabase() {
    let databaseRef = Database.database().reference()
    databaseRef.child("wordList").queryOrderedByKey().observe(.childAdded, with: {
        snapshot in
        let word = (snapshot.value as? NSDictionary)!["word"] as? String
        let wordType = (snapshot.value as? NSDictionary)!["wordType"] as? String
        self.posts.append(postStruct(word: word, wordType: wordType))

        DispatchQueue.main.async {
            self.wordsTableView.reloadData()
        }
        })
}

Попробуйте реализовать это, и оно должно работать.

1 голос
/ 14 марта 2019

Переместите строку «getWordsFromDatabase ()» в функции «viewDidLoad», чтобы ПОСЛЕ того, как вы назначаете делегат и источник данных, например:

override func viewDidLoad() {
    super.viewDidLoad()
    wordsTableView.delegate = self
    wordsTableView.dataSource = self
    getWordsFromDatabase()
}

Также вы можете попробовать добавить «reloadData ()»метод в блоке databaseRef в главной очереди, например:

let databaseRef = Database.database().reference()
databaseRef.child("wordList").queryOrderedByKey().observeSingleEvent(of: .childAdded, with: {
            snapshot in
            let word = (snapshot.value as? NSDictionary)!["word"] as? String
            let wordType = (snapshot.value as? NSDictionary
                )!["wordType"] as? String
            self.posts.insert(postStruct(word: word, wordType: wordType), at: 0)
            DispatchQueue.main.async {
                wordsTableView.reloadData()
            }
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...