Search code examples
iosswiftuitableviewcustom-cell

UITableView Custom cell data mismatched on fast scrolling


    class CalenderCell: UITableViewCell {

    @IBOutlet var lblDay: UILabel!
    @IBOutlet var lblRest: UILabel!
    @IBOutlet var imgCompleted: UIImageView!

    override func awakeFromNib()
    {
        super.awakeFromNib()
    }

    func updateCell(exerciseobject : Exercise)
    {
        let resttext = NSLocalizedString("restday", comment: "")
        let day = NSLocalizedString("day", comment: "")
        let dayexercise = "\(day) \(exerciseobject.exerciseDayID)"

        if !exerciseobject.exerciseRestDay
        {
            lblDay.text = dayexercise
            if exerciseobject.exerciseDayStatus
            {
                imgCompleted.isHidden = false
            }
            else
            {
                imgCompleted.isHidden = true
            }
            lblRest.isHidden = true

        }
        else
        {
            lblDay.isHidden = true
            imgCompleted.isHidden = true
            lblRest.text = resttext
            viewWithTag(100)?.backgroundColor = UIColor(red:1.00, green:0.21, blue:0.28, alpha:1.0)
        }
    }
}

The above is my custom cell class and the below is my tableview class.
When I try to build the app everything is working perfect but whenever I fast scroll the data is mismatching or same data appering in more cells.

I tried:

prepareforreuse() 
{
  //clearing label and images here 
}

in my custom cell class but still getting the fast scrollview data mismatch

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    if let cell = calenderTable.dequeueReusableCell(withIdentifier: "CalenderCell", for: indexPath) as? CalenderCell
    {

        cell.updateCell(exerciseobject: days[indexPath.row])
        return cell
    }

    else
    {
        return UITableViewCell()
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return days.count
}

Solution

  • Either use prepareForReuse and reset your controls to default values or make sure to update all the state for every path in the updateCell method.

    e.g.

    func updateCell(exerciseobject : Exercise)
    {
        let resttext = NSLocalizedString("restday", comment: "")
        let day = NSLocalizedString("day", comment: "")
        let dayexercise = "\(day) \(exerciseobject.exerciseDayID)"
    
        if !exerciseobject.exerciseRestDay
        {
            lblDay.text = dayexercise
            lblDay.isHidden = false
            if exerciseobject.exerciseDayStatus
            {
                imgCompleted.isHidden = false
            }
            else
            {
                imgCompleted.isHidden = true
            }
            lblRest.isHidden = true
    
            viewWithTag(100)?.backgroundColor = nil
        }
        else
        {
            lblDay.isHidden = true
            imgCompleted.isHidden = true
            lblRest.text = resttext
            lblRest.isHidden = false
            viewWithTag(100)?.backgroundColor = UIColor(red:1.00, green:0.21, blue:0.28, alpha:1.0)
        }
    }