'Custom TableViewCell lose its own variable when scrolling

I have the following Custom TableViewCell

Custom TableViewCell

The red(minus) and green(plus) button counts the left label "1"(in code snippet var myQuantity). If I scroll up and down in the tableView the variable myQuantity is always reset to 1 for selected cells.

I read that I have to set the myQuantity in the cellForRowAt method. But how can I set the cell value with its own class variable when its changed via green and red button?

Here my Custom Cell Class:

class ArticleTableViewCell: UITableViewCell {

@IBOutlet var leftLabel: UILabel!
@IBOutlet var rightLabel: UILabel!
@IBOutlet var quantityLabel: UILabel!
var myQuantity = 0

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    
    self.quantityLabel.text = String(self.myQuantity)
    self.leftLabel.sizeToFit()
    self.rightLabel.sizeToFit()
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    if selected {
        self.myQuantity = 1
    } else {
        self.myQuantity = 0
    }

    self.quantityLabel.text = String(self.myQuantity)
}

@IBAction func addButton(_ sender: UIButton) {
    if !self.isSelected { return }
    
    self.myQuantity += 1
    self.quantityLabel.text = String(self.myQuantity)
}

@IBAction func minusButton(_ sender: UIButton) {
    if !self.isSelected { return }
    if self.myQuantity == 1 { return }
    
    self.myQuantity -= 1
    self.quantityLabel.text = String(self.myQuantity)
}}

Here the cellForRowAt Method in my ViewController:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        if let cell = tableView.dequeueReusableCell(withIdentifier: "customArticleCell", for: indexPath) as? ArticleTableViewCell {
            let name: String! = categoryArticles[indexPath.row].name
            let price = categoryArticles[indexPath.row].price
            let price2f = String(format: "%.2f", price)
            
            cell.accessoryType = .none
            cell.leftLabel.text = name!
            cell.rightLabel.text = "\(price2f) €"
            
            if cell.isSelected {
                cell.accessoryType = .checkmark
            }
            
            return cell
       }

}


Solution 1:[1]


class ArticleTableViewCell: UITableViewCell {
    
    @IBOutlet var leftLabel: UILabel!
    @IBOutlet var rightLabel: UILabel!
    @IBOutlet var quantityLabel: UILabel!
    
    var addAction: (()->())?
    var minusAction: (()->())?
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
        self.selectionStyle = .none
    }
    
    func setupCellWith(data: CategoryArticle) {
        self.accessoryType = (data.isSelected == true) ? .checkmark : .none
        self.leftLabel.text = data.name
        let price2f = String(format: "%.2f", data.price)
        self.rightLabel.text = "\(price2f) €"
    }
    
    @IBAction func addButton(_ sender: UIButton) {
        self.addAction?()
    }
    
    @IBAction func minusButton(_ sender: UIButton) {
        self.minusAction?()
    }
}

struct CategoryArticle {
    let name: String
    let price: Double
    var isSelected: Bool?
    var quantity: Int?
}

let categoryArticles: [CategoryArticle] = []

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "customArticleCell", for: indexPath) as! ArticleTableViewCell
    
    let categoryArticle = categoryArticles[indexPath.row]
    cell.setupCellWith(data: categoryArticle)
    
    cell.minusAction = { [weak self] in
        
        // Action you want to do like decrease the count in the model at indexPath.row and set selection in th model too and reload the tableView cell
    }
    
    cell.addAction = { [weak self] in
        
        // Action you want to do like increase the count in the model at indexPath.row and set selection in th model too and reload the tableView cell
    }
    
    return cell
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 mohammed aboarab