0
votes

I have a collection view inside a table view cell at row = 1, that is loaded with content from Firebase Database after the cell is already dequeued. Therefore, using AutoDimensions on the cell at heightForRowAt: doesn't work since at that time, there is no content within the collection view. The collection view is anchored to all sides of the cell. What's the best way of updating the table view cell height at that specific index path when the collection view has loaded all of the data. Thanks!

In the VC containing the table view, I've set up a func retrieving a list of users from the DB that is called in viewDidLoad(), and I've set up protocols to reload the collectionView that is located in the tableView cell class.

fileprivate func retrieveListOfUsers() {
    print ("fetching users from database")
    let ref = Database.database().reference()
    guard let conversationId = conversation?.conversationId else {return}
    ref.child("conversation_users").child(conversationId).observeSingleEvent(of: .value, with: { (snapshot) in
        guard let dictionaries = snapshot.value as? [String:AnyObject] else {return}
        for (key, _) in dictionaries {
            let userId = key
            Database.fetchUsersWithUID(uid: userId, completion: { (user) in
                self.users.append(user)
                DispatchQueue.main.async { 
                    self.reloadDelegate.reloadCollectionView()
                }
            })
        }
    }, withCancel: nil)
}

This is the code for dequeuing the cell. I've removed the code for the first cell in this post since it's irrelevant and didn't want to make you read the unnecessary code.

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

    // Code for cell in indexPath.row = 0

    if indexPath.row == 1 {
        let usersCell = tableView.dequeueReusableCell(withIdentifier: usersCellId, for: indexPath) as! UsersTableViewCell
        usersCell.backgroundColor = .clear
        usersCell.selectionStyle = .none
        usersCell.collectionView.delegate = self
        usersCell.collectionView.dataSource = self
        self.reloadDelegate = usersCell
        usersCell.users = users
        return usersCell
    }
}

If I return UITableView.automaticDimension the collection view doesn't show. It only shows if I set the func to return a constant like 200. I've set estimatedRowHeight and rowHeight in viewDidLoad().

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.row == 0 {
        return UITableView.automaticDimension
    }
    return UITableView.automaticDimension
}
1

1 Answers

0
votes

After you load the data source for the collection view, you can update specific rows in your table like this:

UIView.performWithoutAnimation {
   tableView.reloadRows(at: [indexPath], with: .none)
}

For the row height - try to remove the method implementation, it should be enough if you already set a value for estimatedRowHeight.