簡體   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