2 votes

Comment imprimer dynamiquement une valeur dans UILabel à partir des valeurs du TableView ?

enter image description here

J'ai un tableView avec une cellule personnalisée, chaque fois que je clique sur le bouton de la case à cocher, la valeur à l'intérieur de la cellule augmente, c'est-à-dire, (0 à 1) dans la cellule, et lors du décochage, la valeur diminue, cela fonctionne parfaitement. Mais lorsque j'essaie d'imprimer ces valeurs de la cellule vers un UILabel en dehors du tableView, les valeurs ne changent pas.

Voici le code ci-dessous que j'ai utilisé

   var data = [[String: AnyObject]]()

   func getDetails() {

    let paymentURL = paymentListURL + String(28) + "&student_id=" + String(33)

    Alamofire.request(paymentURL).responseJSON { (response) in
        if ((response.result.value) != nil) {
            var jsonVar = JSON(response.result.value!)
           print(jsonVar)

            if let da = jsonVar["types"].arrayObject {
                self.data = da as! [[String:AnyObject]]
            }
            if self.data.count > 0 {
                self.tableView.reloadData()
            }
        }
    }
}

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

    cell.checkB.tag = indexPath.row
    let ip = data[indexPath.row]
    cell.nameText.text = ip["title"] as? String
    if cell.nameText.text == "Mandatory testing" {

        cell.checkB.checkState = .checked
        cell.backgroundColor = UIColor.lightGray
        cell.checkB.backgroundColor = UIColor.lightGray
    }

    if ip["mandatory"] as? String == "yes" {
        moneyText.text = ip["amount"] as? String
       //moneyText is UILabel outside Tableview
        cell.amountValue.text = ip["amount"] as? String

        cell.checkB.isEnabled = false
    } else {
        moneyText.text = "0"
        if cell.amountValue.text == "1"{
            print("ONE")
        }
    }
    return cell
}

func didPressButton(_ tag: Int) {

    let indexPath = IndexPath.init(row: 0, section: 0)

    let cell = tableView.cellForRow(at: indexPath) as! TabCell

    moneyText.text = String(cell.someValue)        
}

Et pour TableviewCell, j'ai utilisé

protocol TabCellDelegate {
   func didPressButton(_ tag: Int)
   }

class TabCell: UITableViewCell {

@IBOutlet weak var checkB: M13Checkbox!

@IBOutlet weak var nameText: UILabel!

@IBOutlet weak var amountValue: UILabel!

var someValue: Int = 0 {
    didSet {
        amountValue.text = "\(someValue)"
    }
}

@IBAction func checkBAction(_ sender: M13Checkbox) {
    cellDelegate?.didPressButton(sender.tag)

    if checkB.checkState == .checked {
        someValue += 1

    } else if checkB.checkState == .unchecked {
        someValue -= 1

    }       
}

}

J'ai essayé d'abord d'ajouter ces valeurs de la cellule à un tableau, puis d'ajouter toutes les valeurs dans le tableau et d'imprimer dans UILabel, mais les valeurs ne changent pas, elles sont seulement incrémentées, c'est-à-dire que même après avoir décoché la case à cocher, la valeur augmente.

J'ai essayé, même en utilisant le protocole, mais ça n'a pas marché pour moi.

Toute aide sera appréciée.

1voto

Andreas Oetjen Points 4076

Vous mettez à jour someValue de la checkBAction à l'intérieur du TabCell . La propriété didSet mettra ensuite à jour le fichier amountValue l'étiquette. C'est la raison pour laquelle l'étiquette de la cellule est mise à jour.

Vous n'avez pas de code qui met à jour le moneyText après someValue changé. Vous ne réglez moneyText.text de tableView(_:cellForRow:) mais cette fonction est appelée lorsqu'une cellule est affichée, peut-être plusieurs fois après un défilement, etc.

Vous pouvez faire ce qui suit :

  • Créer un délégué à l'intérieur de la cellule (utilisez un protocole personnalisé comme type)
  • Définir le contrôleur comme étant ce délégué
  • Lorsque la valeur change, appelez une fonction de ce délégué (par exemple, appelez le contrôleur).
  • À l'intérieur de celui-ci, mettez à jour le moneyText

En guise d'idée (il se peut qu'elle ne compile pas car je n'ai pas toutes vos classes) :

protocol MyTabCellProtocol {
    func checkboxChanged(_ checkbox:M13Checkbox, atRow:Integer) 
}

class TabCell: UITableViewCell {
    weak delegate:MyTabCellProtocol?

    // ...
    @IBAction 
    func checkBAction(_ sender: M13Checkbox) {

        if checkB.checkState == .checked {
            someValue += 1

        } else if checkB.checkState == .unchecked {
            someValue -= 1
        }
        delegate?.checkboxChanged(self, checkB.tag)
    }
}

class MyController : UIViewController, MyTabCellProtocol {
    func checkboxChanged(_ checkbox:M13Checkbox, atRow:Integer) {
        moneyText.text = "\(checkbox.someValue)"
    }
}

Mais si je réfléchis plus avant, je suggérerais de remanier un peu l'ensemble du code. Le problème que je vois est que votre gestionnaire d'action à l'intérieur de la cellule met à jour le fichier someValue de la cellule, mais ne met pas à jour le modèle extérieur ( ip["amount"] ). Je pense que ce que vous devriez faire est :

  • A l'intérieur de la cellule checkBAction il suffit d'appeler le délégué et de fournir les informations sur la ligne qui a été modifiée ( self.checkB.tag ) et l'état de contrôle. Faites pas mettre à jour le amountValue ici !
  • Dans l'implémentation du délégué, mettez à jour le modèle ip["amount"]
  • Appelez reloadRows(at:with:) de la vue tableau pour rafraîchir la cellule
  • Ensuite, cellForRow est automatiquement appelé, dans lequel vous mettez alors à jour la cellule et l'étiquette extérieure.

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