Почему мой вид коллекции исчезает при обновлении значения степпера? - PullRequest
0 голосов
/ 19 декабря 2018

вот мой упрощенный код в контроллере моего представления

 class WishListVC: UIViewController {

        @IBOutlet weak var wishListCollectionView: UICollectionView!

        private var products = [Product]()
        private var selectedProduct : Product?

        override func viewDidLoad() {
            super.viewDidLoad()

        }



    //MARK: - cell Delegate
  extension WishListVC : ListProductCellDelegate {

     func addToCartButtonDidTapped(at selectedIndexPath: IndexPath, collectionView: UICollectionView) {

        guard let userOrder = userOrder else {return}
        let selectedProduct = products[selectedIndexPath.item]

        Order.addProductToOrderRealmDatabase(userOrder: userOrder, selectedProduct: selectedProduct)
        wishListCollectionView.reloadData()
        updateBadgeOnCartTabBar()


    }

        func stepperButtonDidTapped(at selectedIndexPath: IndexPath, stepperValue: Int, collectionView: UICollectionView) {

            guard let userOrder = userOrder else {return}
            let selectedProduct = products[selectedIndexPath.item]

            if stepperValue > 0 {
                Product.changeProductQuantityInRealmDatabase(selectedProduct: selectedProduct, quantity: stepperValue)
            } else {
                Order.removeProductFromOrderRealmDatabase(userOrder: userOrder, selectedProduct: selectedProduct)
                Product.changeProductQuantityInRealmDatabase(selectedProduct: selectedProduct, quantity: 0)
            }

            wishListCollectionView.reloadData()

            updateBadgeOnCartTabBar()

        }


    }

    //MARK: - Collection View Data Source 
    extension WishListVC : UICollectionViewDataSource, UICollectionViewDelegate {

        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return products.count
        }

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

            guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: WishListStoryboardData.CollectionViewIdentifiers.productSliderCell.rawValue, for: indexPath) as? ListProductCell else { return UICollectionViewCell()}


            cell.productData = products[indexPath.item]
            cell.delegate = self
            cell.collectionView = wishListCollectionView



            return cell
        }

    }

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

protocol ListProductCellDelegate {
    func addToCartButtonDidTapped(at selectedIndexPath: IndexPath, collectionView : UICollectionView)
    func stepperButtonDidTapped( at selectedIndexPath: IndexPath, stepperValue: Int, collectionView : UICollectionView)
}

class ListProductCell: UICollectionViewCell {

@IBOutlet weak var productImageViewAspectRatio: NSLayoutConstraint!

    @IBOutlet weak var addToCartButton: UIButton!
    @IBOutlet weak var stepper: GMStepper!

    var collectionView : UICollectionView?
    var delegate: ListProductCellDelegate?

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

    @IBAction func addToCartButtonDidPressed(_ sender: UIButton) {

        guard let collectionView = collectionView else {return}
        guard let selectedIndexPath = collectionView.indexPathForView(view: sender) else {return}
        self.delegate?.addToCartButtonDidTapped(at: selectedIndexPath, collectionView: collectionView)
    }

    @IBAction func stepperDidTapped(_ sender: GMStepper) {
        guard let collectionView = self.collectionView else {return}
        guard let selectedIndexPath = collectionView.indexPathForView(view: sender) else {return}
        self.delegate?.stepperButtonDidTapped(at: selectedIndexPath, stepperValue: Int(sender.value), collectionView: collectionView)
    }

    private func updateUI() {
        guard let product = productData else {return}

        stepper.value = Double(product.quantity)

        setLikeButton(product: product)
        setCartAndStepperButton()
    }


    private func setCartAndStepperButton() {

        guard let selectedProduct = productData else {return}

        func showStepperButton(status: Bool) {
            // to decide whether to show stepper or add to cart button.

            stepper.isHidden = !status
            stepper.isEnabled = status

            addToCartButton.isHidden = status
            addToCartButton.isEnabled = !status

        }

        if selectedProduct.quantity == 0 {
            showStepperButton(status: false)
        } else {
            showStepperButton(status: true)
        }


    }


}

Я не понимаю, почему после нажатияв первый раз после исчезновения «Добавить в корзину» степпер исчезнет, ​​представление коллекции исчезнет.

У меня нет всего кода collectionView.isHidden, но я не знаю, почему мое представление коллекцииисчезают, как файл .gif ниже

http://g.recordit.co/NAEc36MbrM.gif

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

http://recordit.co/SLdqf1ztFZ.gif

минимальное значение шага установлено равным 1.

Если я изменю данные перезагрузки представления сбора wishListCollectionView.reloadData() в приведенном выше методе stepperButtonDidTapped напросто перезагрузите данные в определенную ячейку только с помощью wishListCollectionView.reloadItems(at: [selectedIndexPath]) проблема будет решена, но значение степпера, кажется, будет обновляться немного медленнее, и это выглядит запаздывающим.

Я не знаю, как отследить последнеелиния, которая будет выполнена, так что это делает мою коллекциювид исчезает.

, и если я перезагружаю данные в главном потоке, используя:

DispatchQueue.main.async {
            self.wishListCollectionView.reloadData()
        }

, это не приведет к исчезновению представления сбора, но если я отредактирую индекс ячейки 4, тобудет влиять на индекс ячейки 1, например, на gif: http://g.recordit.co/6802BJDdtx.gif

Я изменяю число в пятой ячейке, но оно автоматически изменит вторую ячейку.

1 Ответ

0 голосов
/ 19 декабря 2018

Примечание для:

  • Используйте инструмент отладки пользовательского интерфейса Xcode и проверьте, скрыт или пусто ваш collectionView
  • Область - это база данных realTime, любые изменения, сделанные вами в базе данных, будут применены кВаши массивы тоже (например, products массив)

Причиной проблемы со степпером является:

 guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: WishListStoryboardData.CollectionViewIdentifiers.productSliderCell.rawValue, for: indexPath) as? ListProductCell else { return UICollectionViewCell()}

и использование stepperButtonDidTapped удаленного внутри ячейки.объявляйте ваши ячейки один раз и сохраняйте их внутри массива, как показано ниже:

var cellArray:[ListProductCell]=[]
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if (cellArray.count > indexPath.row){
        return cellArray[indexPath.row]
    }else{
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: WishListStoryboardData.CollectionViewIdentifiers.productSliderCell.rawValue, for: indexPath) as? ListProductCell else { return UICollectionViewCell()}
        cell.productData = products[indexPath.item]
        cell.delegate = self
        cell.collectionView = wishListCollectionView
        cellArray.append(cell)
        return cell
    }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...