我是swift和firebase的新手,我正在尝试用firebase数据填充我的tabelview。当我运行程序时,tableview中没有任何内容。任何帮助都将很高兴。这是我做得很远,试图阅读文件,但它没有帮助。
import UIKit
import Firebase
import FirebaseUI
class ChurchTableViewController: UITableViewController {
let firebase = Firebase(url:"https://.....com/")
var items = [NSDictionary]()
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
//self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
override func viewDidAppear(animated: Bool) {
//MARK: Load data from firebsr
firebase.observeEventType(.Value, withBlock: { snapshot in
print(snapshot.value)
}, withCancelBlock: { error in
print(error.description)
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return items.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let dict = items[indexPath.row]
cell.textLabel?.text = dict["ChurchName"] as? String
return cell
}
答案 0 :(得分:2)
您已为Firebase数据库中的某些值更改创建了观察者,但在关闭时您需要添加新项目,当然还要重新加载UITableView
以同步应用中的数据,请参阅下面的代码来看一个如何使用样本数据类型的示例:
var items = [GroceryItem]()
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
firebase.observeEventType(.Value, withBlock: { snapshot in
var newItems = [GroceryItem]()
for item in snapshot.children {
let itemType = GroceryItem(snapshot: item as! FDataSnapshot)
newItems.append(itemType)
}
// update your item with the new ones retrieved
self.items = newItems
// reload the data
self.tableView.reloadData()
})
}
在下面的结构中,您可以看到如何根据Firebase返回的数据创建数据类型的示例
<强> GroceryItem 强>
struct GroceryItem {
let key: String!
let name: String!
let addedByUser: String!
let ref: Firebase?
var completed: Bool!
// Initialize from arbitrary data
init(name: String, addedByUser: String, completed: Bool, key: String = "") {
self.key = key
self.name = name
self.addedByUser = addedByUser
self.completed = completed
self.ref = nil
}
init(snapshot: FDataSnapshot) {
key = snapshot.key
name = snapshot.value["name"] as! String
addedByUser = snapshot.value["addedByUser"] as! String
completed = snapshot.value["completed"] as! Bool
ref = snapshot.ref
}
}
有关如何使用Firebase的更深入知识,您可以阅读这篇非常好的教程:
我希望这对你有所帮助。
答案 1 :(得分:0)
检查您是否正确设置了Tableview的委托和数据源,为此,转到界面构建器,cmd +右键单击您的tableview并拖动到界面构建器中的黄色标题图标。
你应该看到两个选项,'datasource'和'delegate',确保它们都经过检查然后重新运行你的应用程序,你应该看到表格填充了你加载的任何数据
答案 2 :(得分:0)
你有三个问题
1)您没有填充tableview的数据源。这通常是存储在类中的数组,因为它是.value,您需要迭代这些值以获取每个子节点数据
2)你正在观察.value。这将返回节点中的所有内容,所有子节点,子节点等等,因此您无法直接将其作为字符串值读取,除非所有节点都包含,如在单个键中:值对,否则所有键都将被读取:值对将被读取。
3)Firebase是异步的,所以在observe块中,你需要填充数组,然后重新加载tableview
以下是解决方案:
给定结构
users
user_id_0
name: "Biff"
user_id_1
name: "Buffy"
user_id_2
name: "Skip
这里是要在每个名称中读取并填充namesArray
的相关代码var namesArray: [String] = []
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
for child in snapshot.children {
let name = child.value["name"] as! String
namesArray.append(name)
}
self.myTableView.reloadData()
})
将items数组替换为namesArray。
他们的关键是让Firebase在告诉tableView刷新自己之前异步加载数据,并且在使用.Value时,确保使用snapshot.children迭代该节点中的所有子节点
答案 3 :(得分:0)
items
数组中没有数据。因此,首先需要在viewDidAppear
方法内部,将Firebase数据字典追加到items
数组中,然后调用tableView.reloadData()
。items
数组时需要以正确的格式获取和存储数据。