Junaid Khan
Junaid Khan

Reputation: 125

Issue while Expanding and Collapse of Table View Cell

i have a button and some content in a cell. Now when i tap a button i want the cell to expand and collapse, which is working fine for cell whose button is tapped. Now issue is coming that when i have expanded one cell and try to expand another cell while keeping first cell expanded it close first the previous cell and than expand my second cell. I want to expand and collapse the cells parallel and can collapse any cell rather than to collapse first. I'm changing height of cell on click of button. This is my code for expanding and collapsing,

extension ActiveConsultantDetailVC : UITableViewDelegate, UITableViewDataSource

{

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return 5
}
 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == 0
    {
        return 100
    }
    else if indexPath.row == 1
    {
        return 80
    }
    else if indexPath.row == 2
    {
        if (flag == true && indexPath.row == indexValue)
        {
            return UITableView.automaticDimension
        }
        else
        {
            return 40
        }
    }
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
else if indexPath.row == 2
    {
        let cell = consultantTableView.dequeueReusableCell(withIdentifier: "descriptionCell", for: indexPath) as! ConsultDescriptionTVC

        indexDescription = indexPath
        cell.expandBtn.addTarget(self, action: #selector(expandDescriptionView), for: .touchUpInside )

        cell.selectionStyle = .none
        return cell
    }
}

@objc func expandDescriptionView()
{

    let cell = consultantTableView.cellForRow(at: indexDescription) as! ConsultDescriptionTVC
    indexValue = indexDescription.row

    if flag && indexValue == indexDescription.row{
        //statesDetailTableView.beginUpdates()

        self.consultantTableView.reloadRows(at: [indexDescription], with: UITableView.RowAnimation.none)
        // statesDetailTableView.endUpdates()
        cell.expandBtn.setTitle("-", for: .normal)
        flag = false
    }
    else{

        //statesDetailTableView.beginUpdates()

        self.consultantTableView.reloadRows(at: [indexDescription], with: UITableView.RowAnimation.none)
        // statesDetailTableView.endUpdates()
        cell.expandBtn.setTitle("+", for: .normal)

        flag = true
    }
}

As you can see when i tap it call a function that then expand height of cell. My UI Looks like this, enter image description here

Upvotes: 0

Views: 204

Answers (1)

Ahtazaz
Ahtazaz

Reputation: 885

You just need to create 2 Cells in UITableView(In Storyboard). First cell for those who are not expandable and Second cell for the expandable.(In this case, now you don't need to change the Height of the CELL)

class TableVC: UITableViewController {

    // MARK:- Constants And Vars
    var isCellNAME1Expanded = false
    var isCellNAME2Expanded = false
}

class TableVC: UITableViewDataSource, UITableViewDelegate {

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

            let cell = tableView.dequeueReusableCell(withIdentifier: "simpleCell", for: indexPath) as! SideMenuBasicTableViewCell
            switch indexPath.row {
            case 0:
                cell.itemName.text = "HOME"
                break
            case 1:
                cell.itemName.text = "About Us"
                break
            case 2:
                if(isCellNAME1Expanded){
                    //expandedCell
                    let cell = tableView.dequeueReusableCell(withIdentifier: "expandedCell", for: indexPath) as! SideMenuBasicTableViewCell
                    cell.itemName.text = "Expanded- CEll1"
                    return cell
                }else{
                    cell.arrowDownImageView.isHidden = false
                    cell.itemName.text ="Expanded- CEll1"
                }
                break
            case 3:
            if(isCellNAME2Expanded){
                //expandedCell
                let cell = tableView.dequeueReusableCell(withIdentifier: "expandedCell", for: indexPath) as! SideMenuBasicTableViewCell
                cell.itemName.text = "Expanded- CEll2"
                return cell
            }else{
                cell.arrowDownImageView.isHidden = false
                cell.itemName.text = "Expanded- CEll2"
            }
            break
            case 4:
                cell.itemName.text = "Portfolio"
                break
            case 5:
                cell.itemName.text = "Contacts8"
                break
            default:
                break
            }
            return cell
        }

     //And in `DidSelectRow` Method
     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

            if(indexPath.row == 2){
                if(isCellNAME1Expanded){
                    isCellNAME1Expanded = false
                    tableView.reloadRows(at: [indexPath], with: .none)
                }else{
                    isCellNAME1Expanded = true
                    tableView.reloadRows(at: [indexPath], with: .none)
                }
            }if(indexPath.row == 3){
                if(isCellNAME2Expanded){
                    isCellNAME2Expanded = false
                    tableView.reloadRows(at: [indexPath], with: .none)
                }else{
                    isCellNAME2Expanded = true
                    tableView.reloadRows(at: [indexPath], with: .none)
                }
            }else if(indexPath.row == 0){
                // Handle it yourself
            }else if(indexPath.row == 1){
                // Handle it yourself
            }else if(indexPath.row == 4){
                // Handle it yourself
            }else if(indexPath.row == 5){
                // Handle it yourself
            }
        }

    }

Upvotes: 1

Related Questions