Swift Firebase 将数据检索到 tableview

Posted

技术标签:

【中文标题】Swift Firebase 将数据检索到 tableview【英文标题】:Swift Firebase retrieve data into tableview 【发布时间】:2017-10-03 13:13:40 【问题描述】:

我的数据库树

你好, 我正在尝试将数据检索到 tableview,但是虽然我可以从 firebase 数据库中读取数据,但我无法在 table view 中显示它们。我的代码如下,希望你能帮到我。

class Calls 

var callType: String?
var callHospital: String?

init(callType: String?, callHospital: String?) 
    self.callType = callType
    self.callHospital = callHospital



class myCallsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

var ref:DatabaseReference!
var myCallList = [Calls]()

@IBOutlet weak var callListTableView: UITableView!

func numberOfSections(in tableView: UITableView) -> Int 
    return 1


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


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

    let cell = tableView.dequeueReusableCell(withIdentifier: "customcell", for: indexPath) as! myCallsViewControllerTableViewCell

    let test = myCallList[indexPath.row]
    cell.callType?.text = test.callType
    cell.callHospital?.text = test.callHospital

    return cell


override func viewDidLoad() 
    super.viewDidLoad()

     callListTableView.dataSource = self
     callListTableView.delegate = self
   LoadCalls()


func LoadCalls() 
    ref = Database.database().reference()
    let userID = Auth.auth().currentUser?.uid
    ref.child("calls").queryOrdered(byChild: "userID").queryEqual(toValue: userID!).observe(.childAdded, with:  (snapshot) in
        if snapshot.childrenCount > 0
        self.myCallList.removeAll()
            for result in snapshot.children.allObjects as! [DataSnapshot]
                let results = result.value as? [String : AnyObject]
                let type = results?["calltype"]
                let hospital = results?["hospital"]
                let myCalls = Calls(callType: type as! String?, callHospital: hospital as! String?)
                self.myCallList.append(myCalls)
        
                 self.callListTableView.reloadData()
        
        )

【问题讨论】:

能否请您在 LoadCalls 的 for 循环中添加 print 语句 并显示结果 我把转储语句是这样的: let myCalls = Calls(callType: type as!String?, callHospital: hospital as!String?) self.myCallList.append(myCalls) dump(myCalls) 和结果是 Kan_Bagisi_Portali.Calls #0 - callType: nil - callHospital: nil ▿ Kan_Bagisi_Portali.Calls #0 - callType: nil - callHospital: nil ▿ Kan_Bagisi_Portali.Calls #0 - callType: nil - callHospital: nil.... 继续像这样 我想检查一下您是否真的从 firebase 接收到任何数据,因为您的代码似乎没有问题 好的,但是你将如何检查? 【参考方案1】:

我解决了这个问题,非常感谢你们,Blake 和 Siyavash。我注册了单元并放置了调度主队列,它起作用了。这是最新的代码: 类调用

var callType: String?
var callHospital: String?

init(callType: String?, callHospital: String?) 
    self.callType = callType
    self.callHospital = callHospital

类 myCallsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

var ref:DatabaseReference!
var myCallList = [Calls]()

@IBOutlet weak var callListTableView: UITableView!

func numberOfSections(in tableView: UITableView) -> Int 
    return 1


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


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

    let cell = tableView.dequeueReusableCell(withIdentifier: "customcell", for: indexPath) as! myCallsViewControllerTableViewCell

    let test = myCallList[indexPath.row]
    cell.callType?.text = test.callType
    cell.callHospital?.text = test.callHospital

    return cell


override func viewDidLoad() 
    super.viewDidLoad()

     callListTableView.dataSource = self
     callListTableView.delegate = self
   LoadCalls()


func LoadCalls() 
    ref = Database.database().reference()
    let userID = Auth.auth().currentUser?.uid
    ref.child("calls").queryOrdered(byChild: "userID").queryEqual(toValue: userID!).observe(.childAdded, with:  (snapshot) in
                let results = snapshot.value as? [String : AnyObject]
                let type = results?["calltype"]
                let hospital = results?["hospital"]
                let myCalls = Calls(callType: type as! String?, callHospital: hospital as! String?)
                self.myCallList.append(myCalls)
                DispatchQueue.main.async 
                    self.callListTableView.reloadData()
                
        )

【讨论】:

没有问题。如果我的回答对您有帮助,您介意接受吗? 真棒快乐编码:)【参考方案2】:

您的问题可能与您从闭包调用 reloadData() 的事实有关,这意味着您正在从后台线程更新 UI。看看这个答案:

Swift UITableView reloadData in a closure

【讨论】:

我试过了,但它给了我断言失败 -[UITableView _dequeueReusableCellWithIdentifier:forIndexPath:usingPresentationValues:] 然后崩溃 在您发布的代码中,您没有将单元格注册到 tableview。你在其他地方这样做吗? ***.com/questions/12737860/… 是的,我在 UITableViewCell 中使用 @IBOutlet weak var callType: UILabel! IBOutlet weak var callHospital: UILabel! 我想我们可能会谈论两个不同的事情,因为单元格通常不会在 UITableViewCell 类中的 tableview 中注册。注册发生在 tableview 类中。看看这个:hackingwithswift.com/example-code/uikit/…

以上是关于Swift Firebase 将数据检索到 tableview的主要内容,如果未能解决你的问题,请参考以下文章

将 Firebase 快照投射到 Swift 3 对象

FIREBASE 数据库 - 将唯一密钥存储到子节点(Swift/IOS)

使用 Swift 将多个子级添加到 Firebase 数据库

使用 swift 将数据写入 Firebase

在 Swift 3 中将数据添加到 Firebase 而不是 SetValue

Swift 3 Firebase 到 MapKit