Firebase tableview没有填充,Swift
Posted
技术标签:
【中文标题】Firebase tableview没有填充,Swift【英文标题】:Firebase tableview not populating, Swift 【发布时间】:2019-03-01 11:15:59 【问题描述】:我的数据库中有数据,可以搜索单个记录,这很好。但是,当我尝试使用所有数据库记录简单地填充表视图时,它不会接收/显示任何数据。
这是我的代码:
struct drinkStruct
let pub: String!
let rating: String!
let price: String!
override func viewDidLoad()
super.viewDidLoad()
loadDrinks()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
@IBAction func homeClicked(_ sender: Any)
homeClicked()
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].pub
let label2 = cell.viewWithTag(2) as! UILabel
label2.text = posts[indexPath.row].rating
let label3 = cell.viewWithTag(3) as! UILabel
label3.text = posts[indexPath.row].price
return cell
func loadDrinks()
let databaseRef = Database.database().reference().child("Drinks")
ref = Database.database().reference()
databaseRef.queryOrderedByKey().observe(.childAdded, with: (snapshot) in
if let valueDictionary = snapshot.value as? [AnyHashable:String]
let pub = valueDictionary["pub"]
let rating = valueDictionary["rating"]
let price = valueDictionary["price"]
self.posts.insert(drinkStruct(pub: pub, rating: rating, price: price), at: 0)
)
self.tableview.reloadData()
这是我的数据库结构:
我是否在做明显错误的事情?或者任何人都可以看到是什么导致没有数据加载?
没有错误/未使用的变量等。
提前致谢!
【问题讨论】:
回调是异步的,所以你在下载任何东西之前调用 tableView.reloadData() @JoakimDanielson 感谢您的回复 - 那么我应该什么时候给它打电话? 你需要一个数据模型。 使用下面的快速枚举来获取每个数组元素的字典。在 snapshot.children.allObjects 作为饮料! [数据快照] @JoakimDanielson 虽然这是对 那个 问题的一个很好的回答,但它与 Firebase 闭包无关,因为它们的行为不同。 Firebase 闭包中的 UI 调用在主线程上运行,因此不需要调度调用。参见this answer 以及@frankvanpuffelen 对this question 的评论。只需将self.tableview.reloadData()
移动到闭包内即可。
【参考方案1】:
我认为以下应该可以完成这项工作。
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
override func viewDidLoad()
super.viewDidLoad()
//getting a reference to the node //
databaseRef = Database.database().reference().child("Drinks")
//observing the data changes
databaseRef.observe(DataEventType.value, with: (snapshot) in
if snapshot.childrenCount > 0
// clearing the list //
self.posts.removeAll()
// iterating through all the values //
for drinks in snapshot.children.allObjects as! [DataSnapshot]
let drinkObject = drinks.value as! [String: AnyObject]
let drinkPub = drinkObject["pub"]
let drinkRating = drinkObject["rating"]
let drinkPrice = drinkObject["price"]
//creating a drinkStruct object with the model //
let drinkModel = drinkStruct(pub: drinkPub as! String?, rating: drinkRating as! String?, price: drinkPrice as! String?)
//appending it to list
self.posts.append(drinkModel)
// reloading data //
self.tableView.reloadData()
)
var posts = [drinkStruct]()
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) as! YourCustomTableViewCell
let drink: drinkStruct
drink = posts[indexPath.row]
cell.label1.text = drink.pub
cell.label2.text = drink.rating
cell.label3.text = drink.price
return cell
【讨论】:
谢谢你 - 有一些问题,我在你的 func tableView 上遇到错误 - 说“使用未声明的类型'YourCustomTableViewCell'”然后“'UITableViewCell'类型的值没有成员'label1'" + label 2 & 3。谢谢你的帮助! 你没有告诉你如何处理你的表格视图单元格。 这对我来说是全新的——我以前从未使用过表格视图。我如何知道如何处理 tableview 单元格? 这是一个可靠的答案。我可能会将let drinkPub = drinkObject["pub"]
更改为let drinkPub = drinkObject["pub"] as? String ?? "No pub"
以解开可选项并保护代码。 @EoghanCasey 询问如何使用 tableView 超出了问题的范围,您需要了解一些基础知识。互联网上有许多教程,但特别是查看 Ray Wenderlich 的指南,因为它们是一些更好的指南 TableView tutorial【参考方案2】:
对于追随我的新手,我通过做很多事情解决了这个问题。
您需要在情节提要中创建表格视图和单元格布局。然后,您需要一个单元类来指示/分配每个单元中发生的事情(图像视图、标签等),以及一个模型类,用于您正在查找的任何内容,无论对象是什么。
这是我用于我的函数的代码,其中我使用来自 Firebase 的数据填充单元格中的信息:
func loadDrinks()
Database.database().reference().child("Drinks").observe(.childAdded) (snapshot: DataSnapshot) in
if let dict = snapshot.value as? [String: Any]
let pub = dict["pub"] as! String
let rating = dict["rating"] as! String
let price = dict["price"] as! String
let drink = Drink(pub: pub.capitalized, rating: rating.capitalized, price: price.capitalized)
self.drinks.append(drink)
print(self.drinks)
self.tableview.reloadData()
这是一个新手 101 问题 - 我的错。
【讨论】:
以上是关于Firebase tableview没有填充,Swift的主要内容,如果未能解决你的问题,请参考以下文章
从 Firebase 将一组对填充到 tableView 中以仅显示前 3 个最高分数
从 Firebase 下载 json 并填充 TableView Swift 3
在iOS中使用Firebase / Firestore填充tableView时遇到麻烦