[英]Swift 2 Firebase TableView
我是swift和firebase的新手,我試圖用firebase數據填充tabelview。 當我運行該程序時,表視圖中沒有任何顯示。 任何幫助將不勝感激。 這是我到目前為止所做的,試圖閱讀文檔,但沒有幫助。
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
}
您已經為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返回的數據創建數據類型的示例
雜貨項目
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的更深入的知識,您可以閱讀以下非常好的教程:
希望對您有所幫助。
檢查是否已經正確設置了Tableview的委托和數據源,要執行此操作,請轉到界面構建器,使用cmd +右鍵單擊您的表視圖,然后拖動到界面構建器中的黃色標題圖標。
您應該看到兩個選項,“數據源”和“委托”,確保都選中了它們,然后重新運行您的應用程序,您應該看到該表中填充了已加載的所有數據
你有三個問題
1)您沒有為表視圖填充數據源。 這通常是一個存儲在類中的數組,因為它是通過.value進行的,所以您需要遍歷這些值以獲取每個子節點數據
2)您正在通過.value進行觀察。 這將返回節點,所有子節點,它們的子節點等中的所有內容,因此您將無法直接將其讀取為字符串值,除非該節點包含所有節點,例如在單個key:value對中,否則它們都將作為關鍵字: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()
})
將您的項數組替換為namesArray。
它們的關鍵是讓Firebase在告訴tableView刷新自身之前異步加載數據,並且在使用.Value時,請確保您使用snapshot.children遍歷該節點中的所有子級。
items
數組中沒有數據。 因此,首先需要在viewDidAppear
方法內部將Firebase數據字典追加到items
數組中,然后調用tableView.reloadData()
。 items
數組時需要以正確的格式獲取和存儲數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.