繁体   English   中英

UICollectionView不要重用Cell

[英]UICollectionView don't reuse Cell

我的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 bot添加了一个断点,它没有进入该案例。 任何帮助都会很棒。

我认为处理这种情况不是一个好主意。

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

就您而言,它应该类似于以下内容:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM