TableView不显示Firebase数据库中的数据

时间:2019-03-14 14:15:18

标签: ios swift firebase uitableview

我正在构建一个使用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 个答案:

答案 0 :(得分:1)

在分配了委托和数据源后,将“ viewDidLoad”函数中的“ getWordsFromDatabase()”行移至以下位置:

def gcdIter(a, b):
    k = min(a, b)
    while b % k != 0 or a % k != 0:
        k = k - 1
    return k

print(gcdIter(9, 12))
# 3

您还可以尝试在主队列上的databaseRef块中添加“ reloadData()”方法,如下所示:

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

答案 1 :(得分:1)

问题在于您只是在这里观察一个事件:

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()
        }
        })
}

尝试实现这一点,它应该可以工作。