【问题标题】:UICollectionView don't reuse CellUICollectionView 不要重用 Cell
【发布时间】:2015-07-29 14:50:44
【问题描述】:

我的 UIViewController 中有一个 UICollectionview。在滚动集合视图上不重用单元格。你可以看到 numberOfItemsInSection 方法;

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

      return 7

    }

这就是 collectionViewLayout 方法;

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

        if(collectionView == mainCollectionView){
            switch(indexPath.row){
            case 0:
                return CGSize(width: self.view.frame.width, height: self.view.frame.height * 0.20)
            case 1:
                return CGSize(width: (self.view.frame.width * 0.5) - 3, height: self.view.frame.height * 0.2)
            case 2:
                return CGSize(width: (self.view.frame.width * 0.5), height: self.view.frame.height * 0.2)
            case 3:
                return CGSize(width: self.view.frame.width, height: self.view.frame.height * 0.2)
            case 4:
                return CGSize(width: (self.view.frame.width * 0.6) - 3, height: self.view.frame.height * 0.2)
            case 5:
                return CGSize(width: (self.view.frame.width * 0.4), height: self.view.frame.height * 0.2)
            case 6:
                return CGSize(width: (self.view.frame.width), height: self.view.frame.height * 0.2)
            default:
                return CGSize(width: 0, height: 0)
            }
        }
    }

最后一个是cellForRowAtIndexPath方法:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        if(collectionView == mainCollectionView){
            var cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MainCollectionViewCell

            switch(indexPath.row){
            case 0:
                cell.imageView.image = UIImage(named: imageArray[indexPath.row])
                cell.clockIconImageView.hidden = true
                cell.pinIconImageView.hidden = true
                cell.placeLabel.hidden = true
                cell.lineView.hidden = false
            case 1:
                cell.imageView.image = UIImage(named: imageArray[indexPath.row])
                cell.clockIconImageView.hidden = true
                cell.pinIconImageView.hidden = true
                cell.placeLabel.hidden = true
                cell.lineView.hidden = false
            case 2:
                cell.imageView.image = UIImage(named: imageArray[indexPath.row])
                cell.clockIconImageView.hidden = true
                cell.pinIconImageView.hidden = false
                cell.placeLabel.hidden = true
                cell.lineView.hidden = false
            case 3:
                cell.imageView.image = UIImage(named: imageArray[indexPath.row])
                cell.clockIconImageView.hidden = true
                cell.pinIconImageView.hidden = true
                cell.placeLabel.hidden = true
            case 4:
                cell.imageView.image = UIImage(named: imageArray[indexPath.row])
                cell.clockIconImageView.hidden = true
                cell.pinIconImageView.hidden = true
                cell.placeLabel.hidden = true
                cell.lineView.hidden = false
            case 5:
                cell.imageView.image = UIImage(named: imageArray[indexPath.row])
                cell.clockIconImageView.hidden = true
                cell.pinIconImageView.hidden = false
                cell.placeLabel.hidden = true
                cell.lineView.hidden = false
            case 6:
                cell.imageView.image = UIImage(named: imageArray[indexPath.row])
                cell.clockIconImageView.hidden = true
                cell.pinIconImageView.hidden = true
                cell.placeLabel.hidden = true
                cell.lineView.hidden = false
            default:
                break
            }
            return cell
        }

你还可以看到输出:

我已经为 case6 机器人添加了一个断点,它没有进入那个案例。任何帮助都会很棒。

【问题讨论】:

  • 如果有 7 个单元格,则更改开关条件,然后使用此开关((indexPath.row)% 7)
  • 也许第 7 项超出了屏幕的范围,也许您需要滚动一下 UICollectionView 才能加载该视图?
  • 我正在滚动底部以调用 cellForItemAtIndexPath 方法,但它没有重用单元格。

标签: ios swift


【解决方案1】:

我认为这样处理每个案例并不是一个好主意。

您应该创建一个包含您的单元格参数的包装器对象。

在您的情况下,它应该如下所示:

class YourWrapperObject {
  var image: UIImage
  var clockIconHidden: Bool
  var size: CGSize
  // Your other vars
}

创建一个包含这些对象的数组(例如在您的 viewDidLoad 方法中),然后在您的 cellForRowAtIndexPath 方法中:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

  var cell = /*get your cell using reusable identifier*/
  let cellParameters = yourObjectArray[indexPath.row]

  /* Then assign each parameters */
  cell.imageView.image = cellParameters.image
  cell.clockIconImageView.hidden = cellParameters.clockIconHidden
  cell.pinIconImageView.hidden = cellParameters.pinIconHidden
  cell.placeLabel.hidden = cellParameters.placeHidden
  cell.lineView.hidden = cellParameters.lineHidden

  /* return your cell */
  return cell
}

以及在您的 sizeForItemAtIndexPath 方法中:

return yourObjectArray[indexPath.row].size

您的代码将更具可读性和灵活性

【讨论】:

  • 感谢您的评论,我会考虑的。但这不是我问题的答案。
  • 使用此代码,您的单元格应该按照您希望的方式重复使用。如果不是这种情况,请告诉我
【解决方案2】:

在主线程中重新加载 UICollectionView 数据解决了我的问题。我用过:

dispatch_async(dispatch_get_main_queue()) {
                    mainCollectionView.reloadData()
                }

【讨论】:

  • ...您能否详细说明这对 OP 有何帮助?
猜你喜欢
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多