UICollectionViewCell 在滚动开始后立即更改数据

Posted

技术标签:

【中文标题】UICollectionViewCell 在滚动开始后立即更改数据【英文标题】:UICollectionViewCell changes data as soon as scrolling begins 【发布时间】:2020-02-05 02:55:18 【问题描述】:

我有一个完整的页面 UICollectionViewCell,一旦开始滚动,下一个 indexPath 的数据就会被打印出来。这在我的项目中造成了问题,因为即使它几乎没有被拖动,下一个 indexPath 也会被打印出来,并且我的 UICell 中有一个 UIButton,我希望在按下它后立即隐藏它。但是我只希望它隐藏在那个特定的单元格中。由于某种原因,它现在被隐藏在我的 collectionView 的不同索引中。任何事情都会有所帮助,谢谢。

  class CollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout 


       init() 
       super.init(collectionViewLayout: UICollectionViewFlowLayout())
              
       required init?(coder: NSCoder) 
          fatalError("init(coder:) has not been implemented")
              

private var collectionViewFlowLayout: UICollectionViewFlowLayout 
    return collectionViewLayout as! UICollectionViewFlowLayout

override func viewDidLoad() 
    collectionView.showsHorizontalScrollIndicator = false
    collectionView.showsVerticalScrollIndicator = false
    collectionViewFlowLayout.minimumLineSpacing = 0

    self.collectionView.isPagingEnabled = true
    if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout 
        layout.scrollDirection = .horizontal
    
    collectionView?.register(PostCell.self, forCellWithReuseIdentifier: cellId)


   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
       let screenSize = UIScreen.main.bounds.size
       return screenSize

   

      override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
                  return itemsArr.count
           

  var totalPrice = Double()

    @objc func buttonPressed(_ sender : UIButton)
    let item = itemsArr[sender.tag].price
    totalPrice += Double(item) ?? 0
    sender.isHidden = true
    print(item)
    print(totalPrice)


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

      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! PostCell

    let item = itemsArr[indexPath.row]
    cell.set(name: item.name, brand: item.brand, price: item.price)
    cell.myButton.tag = indexPath.row

    cell.myButton.addTarget(self, action: #selector(buttonPressed(_:)), for: .touchUpInside) 
      return cell
  
 

【问题讨论】:

在我看来,你应该为 buttonPressed 使用委托,当用户按下按钮时,你可以获得索引单元格并更新“itemArr”中的单元格数据(在 obj 项目中添加 var“isHidden”)。更新数据完成后,您应该重新加载 collectionview 或重新加载单元格。 使用可以试试 cell.myButton.isHidden = item.isHidden 【参考方案1】:

您需要维护一组隐藏按钮的行索引。然后在渲染单元格时,如果 hiddenRows 中存在该行索引,则在返回单元格之前隐藏按钮。

class CollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout 

    private var hiddenRows = Set<Int>()

    init() 
        super.init(collectionViewLayout: UICollectionViewFlowLayout())
    

    required init?(coder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    private var collectionViewFlowLayout: UICollectionViewFlowLayout 
        return collectionViewLayout as! UICollectionViewFlowLayout
    

    override func viewDidLoad() 
        collectionView.showsHorizontalScrollIndicator = false
        collectionView.showsVerticalScrollIndicator = false
        collectionViewFlowLayout.minimumLineSpacing = 0

        self.collectionView.isPagingEnabled = true
        if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout 
            layout.scrollDirection = .horizontal
        
        collectionView?.register(PostCell.self, forCellWithReuseIdentifier: cellId)
    

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        let screenSize = UIScreen.main.bounds.size
        return screenSize

    

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return itemsArr.count
    

    var totalPrice = Double()

    @objc func buttonPressed(_ sender : UIButton)
        hiddenRows.insert(sender.tag)
        let item = itemsArr[sender.tag].price
        totalPrice += Double(item) ?? 0
        sender.isHidden = true
        print(item)
        print(totalPrice)
    

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

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! PostCell

        let item = itemsArr[indexPath.row]
        cell.set(name: item.name, brand: item.brand, price: item.price)
        cell.myButton.tag = indexPath.row
        cell.myButton.addTarget(self, action: #selector(buttonPressed(_:)), for: .touchUpInside)
           print(item)
        if hiddenRows.contains(indexPath.row) 
            cell.myButton.isHidden = true
         else 
            cell.myButton.isHidden = false
        

        return cell
    
 

【讨论】:

它给了我'协议类型'Any'不能符合'Hashable',因为只有具体类型才能符合私有var hiddenRows上的协议':Set = [] 等我看看。但是你明白这个概念吗? 我的错误。集合的创建方式不同。现在应该可以了。 我将保存单元格的行索引,如果保存的行索引存在于 hiddenRows 中,按钮将被隐藏,这就是我所理解的。但这对我来说仍然是个问题,为什么一旦滚动开始打印的数据就会发生变化? 打印出来的数据是什么意思?

以上是关于UICollectionViewCell 在滚动开始后立即更改数据的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionViewCell 滚动:Swift 3

UICollectionViewCell 在滚动开始后立即更改数据

UICollectionViewCell 在滚动时用动画移除空间

在 UICollectionViewCell 中滑动 UIView 会阻止滚动功能

向下滚动时多次选择 UICollectionViewCell?

在 UICollectionViewCell 上实现在视图上滑动而不在滚动期间滑动