我尝试将Firebase数据库中的数据显示到我的tableView中。代码使用" Tabs View Controller",但为了项目的目的,我必须在经典的ViewController中包含TableView。
以下是应该从数据库获取数据的代码,并进一步将其包含在tableview中。
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中。
以前我必须为控制tableview的每个函数使用override。如果我没有覆盖,我不应该在代码中的某个地方调用这些函数以使它们工作?谢谢。
答案 0 :(得分:3)
observe
的完成块将调用async,您的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已连接。