Tampilan Tabel Swift 2 Firebase

Saya seorang pemula di Swift dan Firebase, saya mencoba mengisi tampilan tabel saya dengan data Firebase. Saat saya menjalankan program, tidak ada yang muncul di tampilan tabel. Bantuan apa pun akan dengan senang hati dihargai. Inilah yang telah saya lakukan sejauh ini, mencoba membaca dokumen, tetapi tidak membantu.

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
}

person Iam Wayne    schedule 17.04.2016    source sumber
comment
Setelah unduhan Anda, jalankan perintah ini tableview.reloaddata()   -  person Mazel Tov    schedule 17.04.2016
comment
Mungkin url Anda salah?   -  person Yuchen    schedule 17.04.2016
comment
Ada tutorial bagus untuk hal ini, kan DI SINI   -  person MikeG    schedule 18.04.2016


Jawaban (4)


Anda telah membuat pengamat ketika beberapa nilai berubah di Firebase DB Anda, tetapi dalam penutupan Anda perlu menambahkan item baru dan tentu saja memuat ulang UITableView Anda untuk menyinkronkan data di aplikasi Anda, lihat kode berikut untuk melihat contoh bagaimana melakukannya dengan tipe data sampel juga:

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()
    })
}

Dalam struktur di bawah ini Anda dapat melihat contoh bagaimana Anda dapat membuat tipe data dari data yang dikembalikan dari Firebase

Item Kelontong

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
   }
}

Untuk pengetahuan lebih dalam tentang cara menggunakan Firebase Anda dapat membaca tutorial yang sangat bagus ini:

Saya harap ini membantu Anda.

person Victor Sigler    schedule 17.04.2016
comment
Terima kasih atas tanggapan Anda, tipe itemnya adalah NSDictionay. Setiap kali saya menggantinya dengan apa yang Anda berikan kepada saya, saya mendapatkan kesalahan di ---› let itemType = NSDictionay(snapshot: item as! FDataSnapshot). Kesalahan mengatakan ( Label argumen '(snapshot:)' tidak cocok dengan kelebihan beban yang tersedia) - person Iam Wayne; 18.04.2016
comment
@IamWayne Itu hanya contoh saja Anda perlu membuat tipe data darinya, lihat jawaban saya yang diperbarui untuk lebih memahami jawabannya dengan cara membuat tipe data - person Victor Sigler; 18.04.2016

Periksa apakah Anda telah mengatur delegasi dan sumber data Tampilan Tabel dengan benar, untuk melakukan ini, buka pembuat antarmuka, cmd + klik kanan pada tampilan tabel Anda dan seret ke ikon judul kuning di pembuat antarmuka.

Anda akan melihat dua opsi, 'sumber data' dan 'delegasi', pastikan keduanya dicentang lalu jalankan kembali aplikasi Anda, Anda akan melihat tabel terisi dengan data apa pun yang telah Anda muat

person NiallJG    schedule 17.04.2016

Anda punya tiga masalah

1) Anda tidak mengisi sumber data untuk tampilan tabel Anda. Ini biasanya berupa array yang disimpan di kelas dan karena berdasarkan .value Anda perlu mengulangi nilai-nilai tersebut untuk mendapatkan setiap data node anak

2) Anda mengamati berdasarkan .value. Ini akan mengembalikan semua yang ada di node, semua anak, anak-anaknya, dll sehingga Anda tidak akan dapat langsung membacanya sebagai nilai string kecuali hanya itu yang ada di node, seperti dalam satu pasangan kunci:nilai, jika tidak semuanya adalah kunci :pasangan nilai akan dibaca.

3) Firebase tidak sinkron sehingga dalam blok observasi, Anda perlu mengisi array, lalu memuat ulang tampilan tabel

Inilah solusinya:

Diberikan sebuah struktur

users    
    user_id_0
       name: "Biff"
    user_id_1
       name: "Buffy"
    user_id_2
       name: "Skip

inilah kode terkait untuk dibaca di setiap nama dan mengisi NameArray

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()
})

gantikan array item Anda dengan array nama.

Kuncinya adalah membiarkan Firebase memuat data secara asinkron sebelum memberi tahu tableView untuk menyegarkan dirinya sendiri, dan saat menggunakan .Value, pastikan Anda mengulangi semua turunan di node tersebut dengan snapshot.children

person Jay    schedule 17.04.2016

  • Hal ini terjadi karena tidak ada data dalam array items Anda. Jadi pertama-tama di dalam metode viewDidAppear Anda perlu menambahkan kamus data Firebase ke dalam array items dan kemudian memanggil tableView.reloadData().
  • Periksa juga apakah url database Firebase Anda benar dan Anda perlu mengambil dan menyimpan data dalam format yang tepat sambil menambahkan ke array items.
person Ashvini    schedule 13.06.2019