почему в моей первой ячейке при просмотре коллекции всегда отображаются неверные данные? - PullRequest
0 голосов
/ 13 января 2019

У меня есть коллекция продуктов, подобных изображению ниже enter image description here

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

но, как вы можете видеть из файла GIF здесь: http://g.recordit.co/HTEVw88Tt4.gif первый продукт (индекс = 0) из ползунка изображения изначально имеет черную кнопку (запас по-прежнему доступен), в массиве у него есть только 1 товар, которого нет в наличии, но после прокрутки вправо, а затем обратно к первому индексу ( index = 0) затем внезапно кнопка становится желтой (как будто теперь у нее 2 товара, которых нет в наличии), даже если товар, которого нет в наличии (желтая кнопка), является только одним товаром.

как решить эту проблему?

Вот упрощенный класс продукта:

    class Product {

        var productID : Int = 0
        var name : String = ""
        var quantityFromServer: Int = 0
        var lowLimit : Int = 0


        var isInStock : Bool {
            return quantityFromServer > lowLimit ? true : false
        }

        convenience init(dictionary: [String:Any]) {
        self.init()

        name = dictionary["products_name"] as? String ?? ""
        quantityFromServer = dictionary["products_quantity"] as? Int ?? 0
        lowLimit = dictionary["low_limit"] as? Int ?? 0

    }
}

в контроллере вида я установил cellForRow, используя приведенный ниже код

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {


        if collectionView == firstListProductCollectionView {

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: HomeStoryBoardData.CollectionViewIdentifiers.productSliderCell.rawValue, for: indexPath) as! ListProductCell

            let selectedProduct = firstProducts[indexPath.item]
            cell.minimumOrderQuantity = selectedProduct.minimumOrderQuantity
            cell.stepperValue = selectedProduct.quantityInCart
            cell.productData = selectedProduct
            cell.delegate = self
            cell.collectionView = firstListProductCollectionView
            cell.indexPath = indexPath



            return cell
           } 
        }

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

class ListProductCell: UICollectionViewCell {

    @IBOutlet weak var addToCartButton: UIButton!

    @IBOutlet weak var counterStackView: UIStackView!
    @IBOutlet weak var textFieldStepper: UITextField!
    @IBOutlet weak var decrementButton: UIButton!
    @IBOutlet weak var incrementButton: UIButton!

    @IBOutlet weak var loveButtonHeightConstraint: NSLayoutConstraint!
    @IBOutlet weak var loveButtonWidthConstraint: NSLayoutConstraint!

    var minimumOrderQuantity = 0
    var stepperValue = 0
    var indexPath: IndexPath?
    var collectionView : UICollectionView?
    var delegate: ListProductCellDelegate?

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

        }
    }


    override func awakeFromNib() {
        super.awakeFromNib()
        setSpecialConstraint()

    }

func checkIfProductIsInStock() {

        guard let product = productData else {return}

        if !product.isInStock {

            showAddToCartButton(status: true)
            addToCartButton.isEnabled = false
            addToCartButton.setTitle("HABIS", for: .normal)
            addToCartButton.setTitleColor(.black, for: .normal)
            addToCartButton.backgroundColor = AppColor.mainYellow.getUIColor()

        }

    }

}

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

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Это происходит из-за поведения удаления из очереди ячеек. На этом этапе я бы рекомендовал переопределить prepareForReuse():

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

В вашем обычном UICollectionViewCell классе добавьте:

override func prepareForReuse() {
    super.prepareForReuse()

    // do the reset/cleanup here...
}
0 голосов
/ 13 января 2019

Клетки сняты, вам нужно еще здесь

if product.isInStock {

   // supply in stock logic here
}
else {

    showAddToCartButton(status: true)
    addToCartButton.isEnabled = false
    addToCartButton.setTitle("HABIS", for: .normal)
    addToCartButton.setTitleColor(.black, for: .normal)
    addToCartButton.backgroundColor = AppColor.mainYellow.getUIColor()

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...