0
votes

TableView montrant des données incorrectes lors du défilement

J'ai une vision de la table et son personnalisé TableViewCell ressemble à ...

TableViewCell montré Ici p>

La case à cocher Nommé Option code> est configurée à l'aide de délégués et est accessible dans la zone ViewController comme ... P>

class UpdatingListTableViewCell: UITableViewCell, UITextFieldDelegate {


    @IBOutlet weak var optionBtn: RoundButton!

    @IBOutlet weak var plannedBtn: RoundButton!

    @IBOutlet weak var doneBtn: RoundButton!

    @IBOutlet weak var whoTextField: UITextField!

    @IBOutlet weak var stdProcedLbl: UILabel!

    @IBOutlet weak var nameLbl: UILabel!
    var delegate: updatingDelegate?

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        plannedBtn.isEnabled = false
        doneBtn.isEnabled = false
        whoTextField.delegate = self
        whoTextField.autocorrectionType = .no
    }


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

        // Configure the view for the selected state
    }

    @IBAction func optionBtnTapped(_ sender: RoundButton) {
        if let _ = delegate {
            delegate?.optionBtnTapped(cell: self)
        }
    }

    @IBAction func plannedBtnTapped(_ sender: RoundButton) {
       if let _ = delegate {
            delegate?.plannedBtnTapped(cell: self)
        }
    }

    @IBAction func doneBtnTapped(_ sender: RoundButton) {
        if let _ = delegate {
            delegate?.doneBtnTapped(cell: self)
        }
    }   
}


0 commentaires

4 Réponses :


0
votes

Le utableviewCell s est réutilisé, si vous souhaitez définir les données correctes dans une cellule chaque fois que vous faites défiler, vous devez remplir les données de cellule entières pour la cellule correspondante dans le méthode car il sera appelé chaque fois que vous faites défiler vers une nouvelle cellule.


3 commentaires

Oui. ... Mais je ne suis pas sûr de la façon dont je peux le faire dans mon cas ...


Si l'état de la cellule change le stocker et remplit les données en conséquence. Dans votre cas, vous semblez changer l'image d'une cellule sélectionnée, définissez à nouveau l'image lorsque cette index est appelée.


Mais je peux sélectionner plusieurs cellules également ... Si je sélectionne deux cellules, comment puis-je comparer ces deux index lors du défilement ...?



0
votes

Vos cellules sont en cours de réutilisation, une fois une case à cocher sélectionnée et que vous ne réinitialisez pas la case la case ultérieurement, son état UI est réutilisé pour un chemin d'index différent. Vous pouvez réinitialiser votre case à cocher dans la fonction PREPARYFORREUSE de Cell's PREPREPREERUSE CellforNatindexPath .


0 commentaires

0
votes

Vous devez réinitialiser la cellule optionbtn.isselected = false code> et optionbtn.setimage (nil, pour: .normal) code> Propriétés dans PREPAREPORERUSE () Code>, comme suit (à l'intérieur de votre UitaireViewCell code> Sous-classe):

override func prepareForReuse() {
    super.prepareForReuse()
    optionBtn.isSelected = false
    optionBtn.setImage(nil, for: .normal)
}


2 commentaires

@ user987654, ahh yea- Vous devez également réinitialiser optionbtn.image à nil sur la réutilisation, voir la mise à jour


Maintenant, les cellules que je n'ai pas sélectionnées ne montrent pas la sélection, mais celle sélectionnée est également réinitialisée à @ 10623169



0
votes

Comme indiqué par d'autres réponses, le problème est lié à la cellule étant réutilisée. Pour résoudre votre problème, vous devez stocker l'état de sélection de chaque index, cela peut être effectué avec une matrice ou un objet personnalisé. Dans cet exemple, une liste simple isselectedlist sera utilisée. XXX

Ici, le OptionBTNTAPED est utilisé pour enregistrer l'état de sélection lors de son évolution. xxx

L'étape finale consiste à mettre à jour toujours la cellule avec le dernier statut de sélection enregistré. xxx


9 commentaires

Ok @ claudio..so pour les autres cases à cocher et Textfield aussi, je vais devoir répéter la même chose ..?


Oui. Vous devez avoir toutes les données stockées, et chaque fois que la cellulefroworat est appelée, vous devez mettre à jour toutes les cases à cocher et les champs de texte, sinon des incohérences sur les cellules présentées seront incohérentes.


sa ne fonctionne pas @Claudio ... Les cases à cocher se répètent à nouveau ...


S'il vous plaît expliquer mieux vous-même, que voulez-vous dire en répétant?


ok @claudio. J'avais sélectionné la case à cocher à la première cellule. Mais lorsque j'ai défilé les cases à cocher des autres cellules apparaissent également sélectionnée.


C'est probablement parce que vous ne réinitialisez pas la cellule, sur la TableView Cellforat vous permet de désactiver la boîte de sélection.


Pouvez-vous peut-être simplement montrer comment je peux faire ça @claudio ..?


Ont édité la question avec le code de tableviewcell. @ Claudio


J'ai mis à jour ma réponse, vous devrez ajouter la logique sur la méthode définie pour représenter les modifications.