DEV
DEV

Reputation: 949

tableview with custom table view cells disappear on scroll

I have a table view with custom tableview cells. Each may have different heights. Totally there are 14 rows but other rows are not visible and when i scroll up and down the rows are disappearing.

Please suggest where i am doing wrong. This is bugging me from 2 days. I am not able to find any solution.

Please find my code below for the tableview.

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{
    return UITableViewAutomaticDimension

}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if(fetchedElements[indexPath.row].elementType=="textarea")
    {
        return 100 ;
    }
    else if (fetchedElements[indexPath.row].elementType=="picklist")
    {
        return 60;
    }
    else if (fetchedElements[indexPath.row].elementType=="divider")
    {
        return 30;
    }
    else if (fetchedElements[indexPath.row].elementType=="scanner")
    {
        return 50;
    }
    else if (fetchedElements[indexPath.row].elementType=="multiselect")
    {
        return 60;
    }
    else if(fetchedElements[indexPath.row].elementType=="text")
    {
       var length =  fetchedElements[indexPath.row].elementText?.characters.count
        if length! < 30
        {
            return 80;
        }else if length! < 60 && length! > 30  {
            return 110;
        }else if(length! < 100 && length! > 60)
        {
            return 130;
        }else if(length! < 150 && length! > 100 )
        {
        return 170;
        }
        else{
            return 140;
        }
    }else
   {
        return 200;

    }

}


func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{
    return UITableViewAutomaticDimension

}

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

    print("No of elements Fetched===\(fetchedElements.count)")
    return fetchedElements.count
}

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


var variableType =  fetchedElements[indexPath.row].elementType
    if(variableType==nil)
    {
      variableType = "";
    }

var elementType = variableType!

    print("=============Element Type=\(elementType)==============")

   let frame = UIScreen.main.bounds

    switch elementType {
    case "picklist":

        let dpcell = Bundle.main.loadNibNamed("Textbox", owner: self, options: nil)?.first as! Textbox

        dpcell.backgroundColor = UIColor.lightGray
        dpcell.txtValue.layer.cornerRadius = 3


        dpcell.LabelName.text = "Country"//fetchedElements[indexPath.row].elementText
        dpcell.txtValue.tag =  Int(fetchedElements[indexPath.row].elementId)
        dpcell.txtValue.addTarget(self, action: #selector(GoToDropdown), for: UIControlEvents.touchDown)
        dpcell.txtValue.backgroundColor = UIColor.white
        dpcell.txtValue.titleLabel?.numberOfLines = 0
        dpcell.txtValue.titleLabel?.adjustsFontSizeToFitWidth = true;
        dpcell.LabelName.lineBreakMode = .byWordWrapping
        dpcell.LabelName.numberOfLines = 0
        dpcell.selectionStyle = .none
        print("============picklist==========\(indexPath.row)")
        return dpcell
    case "multiselect":
        let dpcell = Bundle.main.loadNibNamed("Textbox", owner: self, options: nil)?.first as! Textbox

        dpcell.backgroundColor = UIColor.lightGray
        dpcell.txtValue.layer.cornerRadius = 3
        dpcell.LabelName.text = fetchedElements[indexPath.row].elementText
        dpcell.txtValue.tag =  Int(fetchedElements[indexPath.row].elementId)
        dpcell.txtValue.addTarget(self, action: #selector(GoToMultiSelect), for: UIControlEvents.touchDown)
        dpcell.txtValue.backgroundColor = UIColor.white
        dpcell.txtValue.contentHorizontalAlignment = UIControlContentHorizontalAlignment.left
        dpcell.txtValue.titleLabel?.numberOfLines = 0
        dpcell.txtValue.titleLabel?.adjustsFontSizeToFitWidth = true;
        dpcell.selectionStyle = .none
         print("===========multiselect===========\(indexPath.row)")

        return dpcell

     default:
        let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! UITableViewCell
        cell.textLabel?.text = "default"
         print("==========dummy cell============\(indexPath.row)")
        return cell

}

enter image description here

This happens after scroll down and up

enter image description here

Upvotes: 3

Views: 1492

Answers (2)

user3608914
user3608914

Reputation: 136

Note : I can't comment because i don't have enough reputation, so i could not ask you regarding certain queries i have.. But by reading your codes, this is what i can suggest.

I can see that your data has quite a number of element types,for example, Picklist, divider, scanner and ect, in your heightForRow Delegate method..

However, in your cellForRow function, you have only two cases, PickList and MultiSelect... Thus, all the data types that have different element type, will return you a cell with a big "default" on it.

The only peculiar thing that i do not understand is that the tableview seems to have loaded perfectly in the first try. Thus, i was wondering on how you set up the tableview.

If you set it up in storyboard manually.. Then the first time, when the application loads, it will present whatever you have designed in your UITableView, but the moment you scroll up and down, the CellForItem method will kick in, and re-write the cell, returning you the big "default" cell you see on your list.

So if i am guessing it right..

Then what you have to do is simply adding all the type cases in your cellForRow methods's switch statement.

Upvotes: 1

Daniel Dramond
Daniel Dramond

Reputation: 1598

You might want to look into dispatch async & tableView.reloadData

Since I cannot see all of your code, I would suggest that you create a function that will be called inside viewDidLoad. Inside this function, of course include the lines below, as well as whatever you want inside of your tableView cells. I'm assuming you're using an array for your tableViews data

DispatchQueue.main.async { 

tableView.reloadData

}

Upvotes: 0

Related Questions