Home > Blockchain >  How to change multiple table height dynamically as per array data count
How to change multiple table height dynamically as per array data count

Time:04-06

I have 3 array different array which is cricketMatchArray, soccerMatchArray and tennisMatchArray.I'm display these 3 array data in 3 tableview which is expanding after clicking on header.Now I'm facing an issue table height is not change according to array data.

This output is I'm getting and I want remove that red mark space

for e.g: if cricket and tennis array having a data and soccer array is empty then soccer table height not changing

I want to change tables height dynamically asper array count.

for e.g if cricket and tennis array having a data and soccer array is empty then soccer table height should be 0

Here is my code..

class AllLiveMatchesViewController: UIViewController {
    
    @IBOutlet weak var cricketTableView: UITableView!
    @IBOutlet weak var soccerTableView: UITableView!
    @IBOutlet weak var tennisTableView: UITableView!
    
    var selectedIndx = -1
    var thereIsCellTapped = false
    
    var cricketMatchArray = [LiveMatchesData]()
    var soccerMatchArray = [LiveMatchesData]()
    var tennisMatchArray = [LiveMatchesData]()

    override func viewDidLoad() {
        super.viewDidLoad()

        cricketTableView.dataSource = self
        cricketTableView.delegate = self
        cricketTableView.separatorStyle = .none
        cricketTableView.tableFooterView = UIView()
        
        soccerTableView.dataSource = self
        soccerTableView.delegate = self
        soccerTableView.separatorStyle = .none
        soccerTableView.tableFooterView = UIView()
        
        tennisTableView.dataSource = self
        tennisTableView.delegate = self
        tennisTableView.separatorStyle = .none
        tennisTableView.tableFooterView = UIView()
        
        getCricketMatches()
        getSoccerMatches()
        getTennisMatches()
        
    }
extension AllLiveMatchesViewController: UITableViewDelegate, UITableViewDataSource{
    
    func numberOfSections(in tableView: UITableView) -> Int {
        if tableView == cricketTableView
        {
            return cricketMatchArray.count
        }
        else if tableView == soccerTableView
        {
            return soccerMatchArray.count
        }
        else if tableView == tennisTableView
        {
            return tennisMatchArray.count
        }
        else
        {
            return 0
        }
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if tableView == cricketTableView
        {
            return cricketMatchArray[section].score.count
        }
        else if tableView == soccerTableView
        {
            return soccerMatchArray[section].score.count
        }
        else if tableView == tennisTableView
        {
            return tennisMatchArray[section].score.count
        }
        else
        {
            return 0
        }
    }
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        if tableView == cricketTableView
        {
            let obj = cricketMatchArray[section]
            if cricketMatchArray.count == 0
            {
                return 0
            }
            else
            {
                if obj.inplay == true && obj.status == "OPEN"
                {
                    return 50
                }
                else if obj.inplay == false && obj.status == "OPEN"
                {
                    return 0
                }
                else
                {
                    return 0
                }
            }

        }
        else if tableView == soccerTableView
        {
            let obj = soccerMatchArray[section]
           
            if obj.inplay == true && obj.status == "OPEN"
            {
                return 50
            }
            else if obj.inplay == false && obj.status == "OPEN"
            {
                return 0
            }
            else
            {
                return 0
            }
        }
        else if tableView == tennisTableView
        {
            let obj = tennisMatchArray[section]
            if obj.inplay == true && obj.status == "OPEN"
            {
                return 50
            }
            else if obj.inplay == false && obj.status == "OPEN"
            {
                return 0
            }
            else
            {
                return 0
            }
        }
        else
        {
            return 0

        }
        
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if tableView == cricketTableView
        {
            if indexPath.section == selectedIndx && thereIsCellTapped{
                return 106
            }
            else{
                return 0
            }
            
        }
        else if tableView == soccerTableView
        {
            if indexPath.section == selectedIndx && thereIsCellTapped{
                return 106
            }
            else{
                return 0
            }
            
        }
        else if tableView == tennisTableView
        {
            if indexPath.section == selectedIndx && thereIsCellTapped{
                return 106
            }
            else{
                return 0
            }
            
        }
        else
        {
            return 0
        }

    }
    
    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        
        if tableView == cricketTableView
        {
            if (self.selectedIndx != section) && thereIsCellTapped{
                return 0
            }
            else if (self.selectedIndx == section) && thereIsCellTapped{
                
                return 20
            }
            else
            {
                return 0
            }
            
            
        }
        else if tableView == soccerTableView
        {
            if (self.selectedIndx != section) && thereIsCellTapped{
                return 0
            }
            else if (self.selectedIndx == section) && thereIsCellTapped{
                
                return 20
            }
            else
            {
                return 0
            }
            
        }
        else if tableView == tennisTableView
        {
            if (self.selectedIndx != section) && thereIsCellTapped{
                return 0
            }
            else if (self.selectedIndx == section) && thereIsCellTapped{
                
                return 20
            }
            else
            {
                return 0
            }
            
        }
        else
        {
            return 0
        }
    }

    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ExpandExtTableViewCell.self)) as! ExpandExtTableViewCell
        if section == selectedIndx && thereIsCellTapped{
            cell.footerView.roundCorners(corners: [.bottomLeft,.bottomRight], radius: 10)
        }
        else
        {
            cell.footerView.roundCorners(corners: [.bottomLeft,.bottomRight], radius: 0)
        }
        return cell
    }
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        
        if tableView == cricketTableView
        {
            let cell =  tableView.dequeueReusableCell(withIdentifier: String(describing: ExpandTableViewCell.self)) as! ExpandTableViewCell
            
            let obj = cricketMatchArray[section]
            
            if obj.inplay == false && obj.status == "CLOSE"
            {
                cell.liveView.isHidden = true
            }
            else if obj.inplay == true && obj.status == "OPEN"
            {
                cell.liveView.isHidden = false
            }
            cell.sportIcon.image = UIImage(named: "whiteball")
            cell.teamNameLabel.text = obj.name ?? ""
            cell.btnSelection.tag = section
            cell.btnSelection.addTarget(self, action: #selector(AllLiveMatchesViewController.btnSectionClick(sender:)), for: .touchUpInside)
            
            if section == selectedIndx && thereIsCellTapped{
                cell.headerView.roundCorners(corners: [.topLeft,.topRight], radius: 10)
            }
            else
            {
                cell.headerView.roundCorners(corners: [.topLeft,.topRight,.bottomLeft,.bottomRight], radius: 10)
            }
        
            return cell
        }
        else if tableView == soccerTableView
        {
            let cell =  tableView.dequeueReusableCell(withIdentifier: String(describing: SoccerExpandTableViewCell.self)) as! SoccerExpandTableViewCell
            
            let obj = soccerMatchArray[section]
            
            if obj.inplay == false && obj.status == "CLOSE"
            {
                cell.liveView.isHidden = true
            }
            else if obj.inplay == true && obj.status == "OPEN"
            {
                cell.liveView.isHidden = false
            }
            cell.sportIcon.image = UIImage(named: "soccerball")
            cell.teamNameLabel.text = obj.name ?? ""
            cell.btnSelection2.tag = section
            cell.btnSelection2.addTarget(self, action: #selector(AllLiveMatchesViewController.btnSectionClick2(sender:)), for: .touchUpInside)
            
            if section == selectedIndx && thereIsCellTapped{
                cell.headerView.roundCorners(corners: [.topLeft,.topRight], radius: 10)
            }
            else
            {
                cell.headerView.roundCorners(corners: [.topLeft,.topRight,.bottomLeft,.bottomRight], radius: 10)
            }
            

            return cell
        }
        else if tableView == tennisTableView
        {
            let cell =  tableView.dequeueReusableCell(withIdentifier: String(describing: TennisExpandTableViewCell.self)) as! TennisExpandTableViewCell
            let obj = tennisMatchArray[section]
            
            if obj.inplay == false && obj.status == "CLOSE"
            {
                cell.liveView.isHidden = true
            }
            else if obj.inplay == true && obj.status == "OPEN"
            {
                cell.liveView.isHidden = false
            }
            cell.sportIcon.image = UIImage(named: "tennisracket")
            cell.teamNameLabel.text = obj.name ?? ""
            cell.btnSelection3.tag = section
            cell.btnSelection3.addTarget(self, action: #selector(AllLiveMatchesViewController.btnSectionClick3(sender:)), for: .touchUpInside)
            
            if section == selectedIndx && thereIsCellTapped{
                cell.headerView.roundCorners(corners: [.topLeft,.topRight], radius: 10)
            }
            else
            {
                cell.headerView.roundCorners(corners: [.topLeft,.topRight,.bottomLeft,.bottomRight], radius: 10)
            }
        
            return cell
        }
        else
        {
            let cell =  tableView.dequeueReusableCell(withIdentifier: String(describing: ExpandTableViewCell.self)) as! ExpandTableViewCell
            return cell
        }

    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell =  tableView.dequeueReusableCell(withIdentifier: String(describing: ExpandInsideTableViewCell.self)) as! ExpandInsideTableViewCell
        
        if tableView == cricketTableView
        {
            
            let ob = cricketMatchArray[indexPath.section]
            let obj = cricketMatchArray[indexPath.section].score[indexPath.row]
            
            if obj.spnnation1 == nil
            {
                let teamName = ob.name?.components(separatedBy: " v ")
                
                let fTeamWords =  teamName?[0].split { !$0.isLetter }
                let sTeamWords =  teamName?[1].split { !$0.isLetter }
                
                if fTeamWords?.count == 1
                {
                    let fTeam = teamName?[0].prefix(3)
                    cell.firstTeamName.text = fTeam?.description.uppercased()
                }
                else
                {
                    let fTeam = teamName?[0].getAcronyms()
                    cell.firstTeamName.text = fTeam
                }
                
                if sTeamWords?.count == 1
                {
                    let fTeam = teamName?[1].prefix(3)
                    cell.secondTeamName.text = fTeam?.description.uppercased()
                }
                else
                {
                    let fTeam = teamName?[1].getAcronyms()
                    cell.secondTeamName.text = fTeam
                }
                cell.firstTeamScore.text = obj.score1
                cell.secondTeamScore.text = obj.score2
                cell.dateLabel.text = ob.openDate
                cell.commonScore.isHidden = true
            }
            else
            {
                cell.firstTeamName.text = obj.spnnation1
                cell.secondTeamName.text = obj.spnnation2
                cell.firstTeamScore.text = obj.score1
                cell.secondTeamScore.text = obj.score2
                cell.dateLabel.text = ob.openDate
                cell.commonScore.isHidden = true
            }
            
        }
        else if tableView == soccerTableView
        {
            let ob = soccerMatchArray[indexPath.section]
            let obj = soccerMatchArray[indexPath.section].score[indexPath.row]
            
            if obj.spnnation1 == nil
            {
                let teamName = ob.name?.components(separatedBy: " v ")
                
                let fTeamWords =  teamName?[0].split { !$0.isLetter }
                let sTeamWords =  teamName?[1].split { !$0.isLetter }
                
                if fTeamWords?.count == 1
                {
                    let fTeam = teamName?[0].prefix(3)
                    cell.firstTeamScore.text = fTeam?.description.uppercased()
                }
                else
                {
                    let fTeam = teamName?[0].getAcronyms()
                    cell.firstTeamScore.text = fTeam
                }
                
                if sTeamWords?.count == 1
                {
                    let fTeam = teamName?[1].prefix(3)
                    cell.secondTeamScore.text = fTeam?.description.uppercased()
                }
                else
                {
                    let fTeam = teamName?[1].getAcronyms()
                    cell.secondTeamScore.text = fTeam
                }
                cell.firstTeamName.isHidden = true
                cell.secondTeamName.isHidden = true
                cell.dateLabel.text = ob.openDate
                cell.commonScore.isHidden = false
                cell.commonScore.text = "\(obj.score1 ?? "")-\(obj.score2 ?? "")"
            }
            else
            {
                cell.firstTeamName.isHidden = true
                cell.secondTeamName.isHidden = true
                cell.firstTeamScore.text = obj.spnnation1?.getAcronyms()
                cell.secondTeamScore.text = obj.spnnation2?.getAcronyms()
                cell.dateLabel.text = ob.openDate
                cell.commonScore.isHidden = false
                cell.commonScore.text = "\(obj.score1 ?? "")-\(obj.score2 ?? "")"
            }
        }
        else if tableView == tennisTableView
        {
            let ob = tennisMatchArray[indexPath.section]
            let obj = tennisMatchArray[indexPath.section].score[indexPath.row]
            
            if obj.spnnation1 == nil
            {
                let teamName = ob.name?.components(separatedBy: " v ")
                
                let fTeamWords =  teamName?[0].split { !$0.isLetter }
                let sTeamWords =  teamName?[1].split { !$0.isLetter }
                
                if fTeamWords?.count == 1
                {
                    let fTeam = teamName?[0].prefix(3)
                    cell.firstTeamScore.text = fTeam?.description.uppercased()
                }
                else
                {
                    let fTeam = teamName?[0].getAcronyms()
                    cell.firstTeamScore.text = fTeam
                }
                
                if sTeamWords?.count == 1
                {
                    let fTeam = teamName?[1].prefix(3)
                    cell.secondTeamScore.text = fTeam?.description.uppercased()
                }
                else
                {
                    let fTeam = teamName?[1].getAcronyms()
                    cell.secondTeamScore.text = fTeam
                }
                cell.firstTeamName.isHidden = true
                cell.secondTeamName.isHidden = true
                cell.dateLabel.text = ob.openDate
                cell.commonScore.isHidden = false
                cell.commonScore.text = "\(obj.score1 ?? "")-\(obj.score2 ?? "")"
            }
            else
            {
                cell.firstTeamName.isHidden = true
                cell.secondTeamName.isHidden = true
                cell.firstTeamScore.text = obj.spnnation1?.getAcronyms()
                cell.secondTeamScore.text = obj.spnnation2?.getAcronyms()
                cell.dateLabel.text = ob.openDate
                cell.commonScore.isHidden = false
                cell.commonScore.text = "\(obj.score1 ?? "")-\(obj.score2 ?? "")"
            }
        }
        
        return cell
    }

Can someone help me out with this.

CodePudding user response:

The problem is that you duplicate code but not properties :

 if tableView == cricketTableView
    {
        // This is the problem :
        // only one selectedIndx and one thereIsCellTapped but 3 tables, so it give the same result
        // for the 3 tables
        if (self.selectedIndx != section) && thereIsCellTapped{
            return 0
        }
        else if (self.selectedIndx == section) && thereIsCellTapped{
            
            return 20
        }
        else
        {
            return 0
        }
        
        
    }

You have this problem in :

  • heightForRowAt
  • heightForFooterInSection
  • viewForFooterInSection
  • viewForHeaderInSection
  • and may in didSelectRowAt

CodePudding user response:

As a curiosity question - why do you have 3 separate tableviews instead of one with sections?

Having 3 different UITableViews in one ViewController is in this case - not needed.

By controlling number of cells in section we can simplify the logic of the view later on.

Tapping on the header should control the logic of "hiding" (= setting number of rows in given section to zero) of other sections.

CodePudding user response:

You can use Single TableView with a cell having StackView in it by giving it Top, Leading, Trailing, Bottom. Your number of rows in section should be 3. It means you have three cells in it now populate your arrays in each cell. Your heightForRowAt should be UITableView.automaticDimension

  • Related