Tableview показывает неверные данные при прокрутке - PullRequest
0 голосов
/ 19 июня 2020

У меня есть tableview, и его настраиваемая tableviewcell выглядит так ...

Tableviewcell показан здесь

Теперь флажок с именем option устанавливается с использованием делегатов и доступ к нему осуществляется в контроллере просмотра, вот так ...

func optionBtnTapped(cell: UpdatingListTableViewCell) {
    if let indexPath = standardsProceduresView.tableview?.indexPath(for: cell) {

        cell.optionBtn.isSelected = !cell.optionBtn.isSelected
        if(cell.optionBtn.isSelected)
        {

            //VALUE SET SINCE CHECKBOX ENABLED
            ... ... ...

            let image = UIImage(named: "checkbox.png") as UIImage?
            cell.optionBtn.setImage(image, for: UIControl.State.normal)
        }
        else
        {
            let image = UIImage(named: "square.png") as UIImage?
            cell.optionBtn.setImage(image, for: UIControl.State.normal)
        }
     }
   }

Аналогично устанавливается флажок done и planned (как показано на изображении выше).

1015 * выглядит так ...

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

    let cell: UpdatingListTableViewCell = self.standardsProceduresView.dequeueReusableCellWithIdentifier(identifier: "cellClass") as! UpdatingListTableViewCell

    cell.selectionStyle = .none
    cell.delegate = self

    //Setting up values from an array into the label named 'Risk assessment done' in the tableviewcell
    resolutionDic = resolutionDetailsArray[indexPath.row] as! NSMutableDictionary
    cell.stdProcedLbl.text = "\(resolutionDic["Resolution"]!)"

    return cell

}

Теперь проблема в том, что если я устанавливаю флажок в первой ячейке, а затем прокручиваю вниз, некоторые другие флажки в некоторых других ячейках также отображаются выбранными. То же самое происходит и с флажками «Выполнено» и «Запланировано». То же самое происходит и с текстовым полем с именем whoTextfield (показано на рисунке). Если я ввожу что-то в первой ячейке и прокручиваю вниз, текст появляется в ячейках, в которые я не вводил текст ...

Ссылаются на другие сообщения SO с аналогичной проблемой. Но не удалось найти решение этой проблемы ...

EDIT: это мой код для tableviewcell ..

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)
        }
    }   
}

Ответы [ 4 ]

0 голосов
/ 19 июня 2020

Как указано в других ответах, проблема связана с повторным использованием ячейки. Чтобы решить вашу проблему, вам необходимо сохранить статус выбора каждого индекса, это можно сделать с помощью массива или настраиваемого объекта. В этом примере будет использоваться простой список isSelectedList.

var isSelectedList: [Int: Bool] = [:]

Здесь optionBtnTapped используется для сохранения статуса выбора при его изменении.

func optionBtnTapped(cell: UpdatingListTableViewCell) {
    if let indexPath = standardsProceduresView.tableview?.indexPath(for: cell) {

        cell.optionBtn.isSelected = !cell.optionBtn.isSelected

        // save the new isSelected value, you will need it on the tableView cellForRowAt method call
        isSelectedList[indexPath.row] = cell.optionBtn.isSelected

        if(cell.optionBtn.isSelected)
        {

            //VALUE SET SINCE CHECKBOX ENABLED
            ... ... ...

            let image = UIImage(named: "checkbox.png") as UIImage?
            cell.optionBtn.setImage(image, for: UIControl.State.normal)
        }
        else
        {
            let image = UIImage(named: "square.png") as UIImage?
            cell.optionBtn.setImage(image, for: UIControl.State.normal)
        }
     }
}

Последний шаг всегда обновлять ячейку с последним сохраненным статусом выбора.

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

    let cell: UpdatingListTableViewCell = self.standardsProceduresView.dequeueReusableCellWithIdentifier(identifier: "cellClass") as! UpdatingListTableViewCell

    cell.selectionStyle = .none
    cell.delegate = self


    // Here you customize the cell according to the isSelected value, like you do on the optionBtnTapped method. You should also respect the DRY pattern 
    if isSelectedList[indexPath.row] == true {
        cell.setSelected(true, animated: false)
    } else {
        cell.setSelected(false, animated: false)
    }



    //Setting up values from an array into the label named 'Risk assessment done' in the tableviewcell
    resolutionDic = resolutionDetailsArray[indexPath.row] as! NSMutableDictionary
    cell.stdProcedLbl.text = "\(resolutionDic["Resolution"]!)"

    return cell

}
0 голосов
/ 19 июня 2020

Ваши ячейки используются повторно, поэтому, когда флажок установлен, и вы не сбрасываете этот флажок позже, его состояние пользовательского интерфейса повторно используется для другого пути индекса. Вы можете сбросить свой флажок в функции ячейки prepareForReuse или обязательно назначить правильный статус флажка в cellForRowAtIndexPath.

0 голосов
/ 19 июня 2020

Вам необходимо сбросить свойства optionBtn.isSelected = false и optionBtn.setImage(nil, for: .normal) ячейки в prepareForReuse() следующим образом (внутри вашего подкласса UITableViewCell):

override func prepareForReuse() {
    super.prepareForReuse()
    optionBtn.isSelected = false
    optionBtn.setImage(nil, for: .normal)
}
0 голосов
/ 19 июня 2020

UITableViewCell s используются повторно, если вы хотите устанавливать правильные данные в ячейку каждый раз, когда вы прокручиваете, вы должны заполнить все данные ячейки для соответствующей ячейки в методе cellForRow, потому что он будет вызываться каждый раз, когда вы переходите к новой ячейке.

...