UICollectionViewCell клики не будут регистрироваться правильно - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть UICollectionView с некоторыми ячейками.

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

Поведение:

Если у меня есть ячейка A и ячейка B, и я щелкнул ячейку A, а затем ячейку B, щелчок по ячейке B регистрируется как щелчок по ячейке A. Другой щелчок по ячейке B затем правильно регистрируется на B.

В соответствии с этим, первый щелчок по ЛЮБОЙ ячейке, как только загрузка вида игнорируется.Если дважды щелкнуть ячейку A после щелчка по ячейке B, то в итоге получится, что ячейка B была нажата один раз, а ячейка A - один раз.

Другой способ посмотреть на нее:

Всякий раз, когда быЯ щелкаю по ячейке, в то время как предыдущий щелчок был по РАЗНОЙ ячейке, новый щелчок регистрируется в предыдущей ячейке.

Другой способ посмотреть на нее:

Каждый щелчок регистрируется в предыдущей ячейке.нажал на ячейку.

Я смущен этим.Любая помощь, пожалуйста?

Мой класс:

class SelectCells: ProductsTableViewController
{

    var m_productsToPurchaseList : [String : Double] = [:]
    var m_sellerID = ""

    override func viewDidLoad()
    {
        super.viewDidLoad()

        self.LoadProductsByUserID(productsToShow: Constants.Products.ProductTrees.MY_SALES, UserID: m_sellerID) // My sales is all sales in contact perspective

    }

    override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
    {
        // Display selected Item

        print(indexPath.item)
        print(indexPath.section)

        let prodForPurchase = products[indexPath.row]
        let prodForPurchaseID = prodForPurchase.getUniqueID()

        prodForPurchase.toggleProductSelected()

        if (prodForPurchase.isProductMarked())
        {
            // Product not yet marked for purchase. Need to add it for purchase
            m_productsToPurchaseList[prodForPurchaseID] = prodForPurchasePrice
        }
        else
        {
            // Product already marked for purchase. Need to remove it from purchase
            m_productsToPurchaseList.removeValue(forKey: prodForPurchaseID)
        }

        ProductsCollection.reloadData()

    }        
}

Функции из суперкласса:

extension ProductsCollectionViewController: UICollectionViewDataSource
{

    func createCollectionViewCell(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "product_collection_cell", for: indexPath) as! ProductsCollectionViewCell
        cell.ProductImageView.image = nil
        cell.ProductName.text = nil
        cell.ProductPrice.text = nil
        cell.productUniqueID = nil

        let prodInCell =  searchActive ? filtered[indexPath.row] : products[indexPath.row]

        let prodID = prodInCell.getUniqueID()
        cell.contentMode = .scaleAspectFit

        if let str = prodInCell.urlStr
        {
            cell.ProductImageView.sd_setImage(with: URL(string:str), placeholderImage: #imageLiteral(resourceName: "DefaultProductImage"))
        }
        else
        {
            let dbRef = Storage.storage().reference().child(prodID).child("pic0.jpg")
            cell.contentMode = .scaleAspectFit
            cell.ProductImageView.image = #imageLiteral(resourceName: "DefaultProductImage")
            dbRef.downloadURL(completion:
                {
                    url, error in
                    if let error = error
                    {
                        Constants.logger.error(error)
                    }
                    else if let url = url
                    {
                        prodInCell.setUrlStr(str: url.absoluteString)  // store for upcoming need
                        cell.ProductImageView.sd_setImage(with: URL(string:url.absoluteString), placeholderImage: #imageLiteral(resourceName: "DefaultProductImage"))
                        cell.ProductImageView.contentMode = UIViewContentMode.scaleToFill
                        cell.layoutIfNeeded()
                    }
            })

        }
        cell.ProductImageView.clipsToBounds = true
        cell.ProductName.text = prodInCell.getName()
        cell.ProductPrice.text = String(prodInCell.getPrice())
        cell.productUniqueID = prodInCell.getUniqueID()

        let isProductMarked : Bool = prodInCell.isProductMarked()

        cell.backgroundColor = isProductMarked ? UIColor.green : UIColor.clear
        cell.layer.borderColor = isProductMarked ? UIColor.yellow.cgColor : UIColor.black.cgColor

        return cell
    }


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

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
    {
        // Display selected Item
        prodToLoad = products[indexPath.row]
        performSegue(withIdentifier: "view_product_information", sender:self  )
    }



    // Swift 3.0
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    {
        return GetViewCGSize(collectionView)
    }

// This function was created so that we can override it for different views that are ProductsCollectionView to have cells look different
    func GetViewCGSize(_ collectionView: UICollectionView) -> CGSize
    {
        return CGSize(width: CGFloat((collectionView.frame.size.width / 3) - 20), height: CGFloat(100))
        }
   }

Ответы [ 2 ]

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

Вы не опубликовали реализацию isProductMarked() func.Похоже, его значение не обновляется.Не забудьте обновить помеченный флаг продукта на кране.

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

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

После перезагрузки проверьте, что элементы находятся в желаемом состоянии.

Также попробуйте удалить код из cellForItem и внедрить его в классе ячеек.

...