2 votes

Swift:- Incrémenter la valeur de l'étiquette par 1 lors du clic sur le bouton dans une cellule de tableau personnalisé

J'essaie d'augmenter la valeur de l'étiquette de 1 en cliquant sur le bouton qui se trouve dans une cellule de tableau personnalisée. Je suis capable de changer les valeurs différemment dans les différentes cellules mais le problème est que si je tape + dans la première cellule, l'étiquette passe de 0 à 1, quand je tape + dans la deuxième cellule, l'étiquette passe directement de 0 à 2 et ainsi de suite dans les autres cellules. Comment puis-je résoudre ce problème ?

     var counts = 0

    @IBAction func addPressed(_ sender: UIButton) {
    let indexPath = IndexPath(row: sender.tag, section: 0)
    let cell = tblview.cellForRow(at: indexPath) as! HomeDetailsTableViewCell
    counts = (counts + 1)
    cell.lblNoOfItems.text = "\(counts)"
}

3voto

PGDev Points 6277

Il y a deux façons d'y parvenir :

1. Gardez le compte de chaque cellule dans un Array au controller et chaque fois que vous appuyez sur la touche button on récupère le compte dans le tableau et on l'utilise, c'est-à-dire que

var counts = [Int](repeating: 0, count: 10) //10 is the number of cells here

@IBAction func addPressed(_ sender: UIButton) {
    let indexPath = IndexPath(row: sender.tag, section: 0)
    let cell = tblview.cellForRow(at: indexPath) as! HomeDetailsTableViewCell
    counts[indexPath.row] += 1
    cell.lblNoOfItems.text = "\(counts[indexPath.row])"
}

2. Gardez le compte de chaque cellule dans la cellule personnalisée elle-même, c'est-à-dire dans HomeDetailsTableViewCell c'est-à-dire

class HomeDetailsTableViewCell: UITableViewCell {
    var count = 0
    //Rest of the code...
}

@IBAction func addPressed(_ sender: UIButton) {
        let indexPath = IndexPath(row: sender.tag, section: 0)
        let cell = tblview.cellForRow(at: indexPath) as! HomeDetailsTableViewCell
        cell.count += 1
        cell.lblNoOfItems.text = "\(cell.count)"
}

En outre, la façon dont vous mettez en œuvre le code pour l'ajout de + button n'est pas correct. Vous devez l'implémenter dans le HomeDetailsTableViewCell lui-même, c'est-à-dire

class HomeDetailsTableViewCell: UITableViewCell {
    @IBOutlet weak var lblNoOfItems: UILabel!
    var count = 0

    @IBAction func addPressed(_ sender: UIButton) {
        self.count += 1
        self.lblNoOfItems.text = "\(self.count)"
    }
    //Rest of the code...
}

1voto

Sreekanth G Points 185

Vous pouvez obtenir la réponse à cette question en utilisant le code ci-dessous dans le fichier Swift 5

// 1ère étape

Dans votre TableViewCell

import UIKit

@objc protocol CellDelagate : NSObjectProtocol {

    func addPressed(_ cell: TableViewCell)
}

class TableViewCell: UITableViewCell {

    var cellDelagate: CellDelagate?
    var indexPath : IndexPath?
    @IBOutlet weak var gPaybutton: UIButton!
    @IBOutlet weak var proceesingLabel: UILabel!

    var count = 0

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    @IBAction func proccessingButtonTapped(_ sender: UIButton) {

        self.cellDelagate!.addPressed(self)
        if gPaybutton.tag == indexPath?.row {

        }
    }
}

// 2e étape

Dans votre ViewController

class ViewController: UIViewController {

    @IBOutlet weak var tableview: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate, CellDelagate {

    func addPressed(_ cell: TableViewCell) {

        cell.count += 1
        cell.proceesingLabel.text = "Processing : \(cell.count)"
    }

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

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell")! as? TableViewCell//1.

        cell?.indexLabel?.text = yourArray[indexPath.row] //2.
        cell?.cellDelagate = self //3.
        cell?.tag = indexPath.row //4.
        return cell! //5.
    }
}

0voto

dreamBegin Points 1431

C'est parce que vous utilisez une variable globale pour toutes les cellules de votre classe. Si vous voulez maintenir le compte différemment pour chaque cellule, vous devez utiliser des variables différentes pour chaque cellule. .

Créez une source de données pour votre compte et initialisez-la avec la même source de données que vous utilisez pour votre table, par exemple, supposez que vous avez un tableau de chaînes pour votre source de données de tableview, créons un tableau de listes qui contient votre titre et votre compte. Je vous donne toutes les étapes de ma solution, vous avez juste à mettre le code au bon endroit : -.

//Suppose this is your tableivew data source
let list : [String] = ["Title1","Title2","Title3"]

//Make a dictionary that is going to be your datasource of tableview holding the count too
var listDict : [[String:Any]] = []
for item in list{
    let dict : [String:Any] = ["title":item,"count":Int(0)]
    listDict.append(dict)
}

//Where you are performing the actions like in didSelectRow or in any button
let cellIndexPath : IndexPath = IndexPath(item: 0, section: 0) // Get the indexPath of Cell

//Update the count
if let count = listDict[cellIndexPath.row]["count"] as? Int{
    let newValue = count + 1
    listDict[cellIndexPath.row]["count"] = newValue
}

//Reload the tableview cell of update manually your choice I'm reloading the cell for short
let tableview = UITableView()
tableview.reloadRows(at: [cellIndexPath], with: .fade)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X