How to retrieve data from firebase in a collectionView inside a tableViewCell?

Viewed 36

I'm trying to retrieve data from firebase, but I need the data to show up in a collectionView that's inside a tableViewCell (which makes it a bit confusing).

I have three files. FeedTableViewCell, FeedCollectionViewCell, FeedViewController.

Normally I would just call the retrieve function in the FeedViewController/ViewDidLoad function. But since I need it in the collectionView its not working in this case. Where can I add the function so I can use it in my collectionView? Or how can I reformat the code?

Code below isn't working (Fatal error in FeedTaabelViewCell file when run). I've tried adding the retrieve function inside FeedTableViewCell, but there isn't a ViewDidLoad function so its not working. The best I can come up with is to leave it in the main FeedViewController file, but then how do I call it in FeedTableViewCell file?

class FeedTableViewCell: UITableViewCell {

    @IBOutlet weak var collectionView: UICollectionView!
    var refArtists: DatabaseReference!
    var userList = [UserModel]()
    
    override func awakeFromNib() {
        super.awakeFromNib()
        collectionView.delegate = self
        collectionView.dataSource = self
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

    }

}

extension FeedTableViewCell: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 2
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! FeedCollectionViewCell
        
        let artist: UserModel
//ERROR: INDEX OUT OF RANGE
        artist = userList[indexPath.row]

        cell.nameLabel.text = artist.name
        
 
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let itemWidth = collectionView.bounds.width
        let itemHeight = collectionView.bounds.height
        return CGSize(width: itemWidth, height: itemHeight)
    }
}
class FeedCollectionViewCell: UICollectionViewCell {
    
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var passionLabel: UILabel!
    @IBOutlet weak var distanceLabel: UILabel!
    
    @IBOutlet weak var feedCellImage: UIImageView!
}
class FeedViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
   
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)

        return cell
    }


    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        var bounds = UIScreen.main.bounds

        return bounds.size.height - (self.tabBarController?.tabBar.frame.size.height)!
    }

    var refArtists: DatabaseReference!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        refArtists = Database.database().reference().child("users");
        
        //observing the data changes
        refArtists.observe(DataEventType.value, with: { [self] (snapshot) in
                    
                //if the reference have some values
                if snapshot.childrenCount > 0 {
                    
                    //clearing the list
                    userList.removeAll()
                    
                    //iterating through all the values
                    for artists in snapshot.children.allObjects as! [DataSnapshot] {
                        //getting values
                        let artistObject = artists.value as? [String: AnyObject]
                        let userName  = artistObject?["name"]
                        let userId  = artistObject?["id"]
                        let userInterest = artistObject?["interest"]
                        
                        //creating artist object with model and fetched values
                        let artist = UserModel(id: userId as! String?, name: userName as! String?, interest: userInterest as! String?)
                        
                        //appending it to list
                        userList.append(artist)

                    }
                    

                    
                }
            })

    }
1 Answers

class FeedViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)
        cell.userList = userList
        return cell
    }


    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        var bounds = UIScreen.main.bounds

        return bounds.size.height - (self.tabBarController?.tabBar.frame.size.height)!
    }
Related