как сохранить значение в ячейке представления таблицы после повторного использования ячейки после прокрутки?

вот .gif моей проблемы: http://g.recordit.co/LnslGAaWwK.gif

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

но, если я нажму кнопку увеличения, он будет работать, но все равно будет давать неправильное значение, он снова начнется с 1 и не продолжит значение до прокрутки.

Я подозреваю, что проблема здесь (полный код ниже):

    override func awakeFromNib() {
        super.awakeFromNib()
        setStepper()
    }

кажется, что после прокрутки до нижней части представления таблицы, кажется, что setStepper() в awakeFromNib() будет запущен снова, и это означает, что начальное значение из степпера (stepper.value = 0), снова вернется к нулю, возможно, поэтому, если я нажму кнопку увеличения, он будет дать 1, не продолжая значение перед прокруткой

вот код из моей ячейки представления таблицы

import UIKit
import KWStepper

protocol CounterDelegate{
    func incrementOrDecrementButtonDidTapped(at selectedIndexPath:IndexPath, counterValue: Int)
}

class CheckOutCell: UITableViewCell {

    var stepper: KWStepper?
    var indexPath: IndexPath?
    var delegate: CounterDelegate?

    @IBOutlet weak var counterLabel: UILabel!
    @IBOutlet weak var decrementButton: UIButton!
    @IBOutlet weak var incrementButton: UIButton!

    var productData : Product? {
        didSet {
            updateUI()
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        setStepper()
    }


    func setStepper() {

        stepper = KWStepper(decrementButton: decrementButton, incrementButton: incrementButton)
        guard let stepper = stepper else {return}

        stepper.autoRepeat = false
        stepper.wraps = false
        stepper.minimumValue = 0
        stepper.value = 0
        stepper.incrementStepValue = 1
        stepper.decrementStepValue = 1

        stepper.valueChangedCallback = { stepper in
            let stepperValue = Int(stepper.value)

            // send data to CheckoutVC
           guard let indexPath = self.indexPath else {return}
           self.delegate?.incrementOrDecrementButtonDidTapped(at: indexPath, counterValue: stepperValue)

            print(stepperValue)

        }
    }



    func updateUI() {

        guard let productData = productData else {return}
        counterLabel.text = "\(productData.quantity)"


    }


}

так как решить эту проблему? как сохранить значение после прокрутки таблицы вниз?


person sarah    schedule 03.11.2018    source источник
comment
Кажется, вам нужно обновить productData.quantity во время увеличения и уменьшения, позвольте мне увидеть ваш контроллер табличного представления   -  person Hamed    schedule 03.11.2018
comment
Ваша ячейка не должна ничего знать о модели данных или ее строке. Обратным вызовом должен быть контроллер представления I; tomyoir, который может обновлять модель данных.   -  person Paulw11    schedule 03.11.2018


Ответы (1)


Вам нужно переосмыслить свою стратегию.

TableView - это только визуальное представление данных в своем источнике данных, и только часть источника данных видна одновременно.

Таким образом, данные, отображаемые TableViewCell, должны храниться в источнике данных, а не в ячейке.

Организуйте свои данные в массив и позвольте источнику данных TableViews указывать на этот массив. Вам необходимо реализовать методы протокола UITableViewDatasource (numberOfSections, numberOfRowsInSection).

Затем переопределите cellForRowAtIndexPath, где ячейка настроена с данными, поступающими из массива источников данных с индексом indexPath.row.

Затем изменения, сделанные с помощью вашего шагового двигателя, должны быть внесены в источник данных.

Надеюсь, вы уловили идею.

person zisoft    schedule 03.11.2018