簡體   English   中英

Swift 2 Firebase TableView

[英]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()
  • 還要檢查您的Firebase數據庫URL是否正確,並且在附加到items數組時需要以正確的格式獲取和存儲數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM