Kyle C. Beachem
Kyle C. Beachem

Reputation: 51

Retrieving firebase children and populating them in a UITableView

Trying to query firebase children and retrieve a snapshot array of their data into a tableview. Not sure if I am implementing this correctly, but I am not the getting a runtime error. However, my tableview is just white with no objects displaying. Some feedback would be helpful. Thanks.

Here is my FB JSON tree structure

Here is my FB JSON tree structure.

Here is my User class (var userList = User)

Here is my User class (var userList = [User]())

class CDetailTableViewController: UITableViewController {


    static var imageCache = NSCache<AnyObject, UIImage>()

    var userList = [User]()

    var ref = FIREBASE.FBDataReference().ref

    var refHandle: UInt!



    override func viewDidLoad() {
        super.viewDidLoad()

        ref = FIREBASE.FBLink().FBref
        configureCell()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

    override func numberOfSections(in 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 userList.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! CDetailTableViewCell



        cell.priceLabel?.text = userList[indexPath.row].priceLabel
        cell.titleLabel?.text = userList[indexPath.row].titleLabel
        cell.itemPhoto?.image = userList[indexPath.row].objectImage

        return cell


    }


    func configureCell(){

        let ref = FIRDatabase.database().reference()

        let userID = FIRAuth.auth()?.currentUser?.uid

        refHandle = ref.child("Enterpriser Listings").child("Sell Old Stuff - Listings").child(userID!).observe(.childAdded, with: { (snapshot) in

            if let dictionary = snapshot.value as? [String : AnyObject]  {

                print("get dictionary")
                print(dictionary)

                let user = User()

                user.setValuesForKeys(dictionary)
                self.userList.append(user)

                // Get user value

                DispatchQueue.main.async {

                    print("reloaded")

                    self.tableView.reloadData()
                }


            }
        })

    }


    /*
    // Override to support conditional editing of the table view.
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        // Return false if you do not want the specified item to be editable.
        return true
    }
    */

    /*
    // Override to support editing the table view.
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            // Delete the row from the data source
            tableView.deleteRows(at: [indexPath], with: .fade)
        } else if editingStyle == .insert {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
        }    
    }
    */

    /*
    // Override to support rearranging the table view.
    override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {

    }
    */

    /*
    // Override to support conditional rearranging of the table view.
    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        // Return false if you do not want the item to be re-orderable.
        return true
    }
    */

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

Upvotes: 0

Views: 172

Answers (2)

Nirav D
Nirav D

Reputation: 72440

May be the problem is with your Firebase reference, try like this way.

ref.child("Enterpriser Listings").child("Sell Old Stuff - Listings").observe(.value, with: { (snapshot:FIRDataSnapshot) in
    var users = [User]()
    for child in snapshot.children {
        print("\((sweet as! FIRDataSnapshot).value)")
        if let dictionary = child.value as? [String : AnyObject]  {
            let user = User()
            user.setValuesForKeys(dictionary)
            users.append(user)
        } 
    }
    self.userList = users
    self.tableView.reloadData()
})

Upvotes: 1

Vlad Pulichev
Vlad Pulichev

Reputation: 3272

Simple question. Have you delegated your tableview?

class YourController: < other >, UITableViewDataSource, UITableViewDelegate {
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() { //for example this function
        super.viewDidLoad()

        self.tableView.delegate = self
        self.tableView.dataSource = self
}

Upvotes: 0

Related Questions