【问题标题】:Swift Firebase retrieve data into tableviewSwift Firebase 将数据检索到 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 接收到任何数据,因为您的代码似乎没有问题
  • 好的,但是你将如何检查?

标签: swift uitableview firebase firebase-realtime-database


【解决方案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。你在其他地方这样做吗? stackoverflow.com/questions/12737860/…
  • 是的,我在 UITableViewCell 中使用 @IBOutlet weak var callType: UILabel! IBOutlet weak var callHospital: UILabel!
  • 我想我们可能会谈论两个不同的事情,因为单元格通常不会在 UITableViewCell 类中的 tableview 中注册。注册发生在 tableview 类中。看看这个:hackingwithswift.com/example-code/uikit/…
猜你喜欢
  • 1970-01-01
  • 2016-10-20
  • 2018-01-19
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
相关资源
最近更新 更多