UICollectionView单元格在向上滚动或重新加载函数时随机消失 - iOS 9 / Swift

时间:2016-07-14 05:45:45

标签: swift uicollectionview ios9 uicollectionviewcell

在STO和其他博客上查看完解决方案之后,似乎没有人真正解决其他人今天似乎仍然需要的UICollectionView问题!

避免重载功能最初加载CollectionVC没有问题,向下滚动到底部也没有问题,但是当我向上滚动时,随机单元格会丢失。另外,注意到我在滚动时多次调用下面的委托方法,这是正常的吗?

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

使用任何重载函数会导致随机单元格.backgroundView消失:

self.collectionView?.reloadSections(NSIndexSet.init(index: 0))
self.collectionView?.reloadData()
self.collectionView?.reloadItemsAtIndexPaths(cellIndexPathArray)
self.collectionView?.reloadInputViews()

使用不同的覆盖选项对UICollectionViewFlowLayout进行子类化似乎没有效果。

class CustomCollectionFlowLayout: UICollectionViewFlowLayout {

override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
    //self.scrollDirection = UICollectionViewScrollDirection.Vertical
    return true
    //invalidateLayoutWithContext(invalidationContextForBoundsChange(newBounds))
    //return super.shouldInvalidateLayoutForBoundsChange(newBounds)
}

override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    /*
    let attributes = super.layoutAttributesForElementsInRect(rect)
    print(attributes)
    let contentSize = collectionViewContentSize()
    return attributes?.filter { $0.frame.maxX <= contentSize.width && $0.frame.maxY < contentSize.height }
     */

    let attributes = super.layoutAttributesForElementsInRect(rect)
    return attributes

}

}

CollectionVC.swift

private let reuseIdentifier = "cell"

class CollectionVC: UICollectionViewController {

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

override func viewDidLoad() {
    super.viewDidLoad()
    //Register cell class
    self.collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
}

////////////////////////////////
//UICollectionViewDataSource
////////////////////////////////
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of items
    return appDelegate.chosenImageArray.count
}

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

    // Configure the cell
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)
    cell.backgroundColor = UIColor.clearColor()
    cell.layer.borderColor = UIColor.whiteColor().CGColor
    cell.layer.borderWidth = 1
    cell.layer.cornerRadius = 8

     let bgView = appDelegate.chosenImageArray.objectAtIndex(indexPath.row) as? UIView

      if bgView != nil {
                cell.backgroundView = bgView
                cell.hidden = false
                cell.backgroundView?.hidden = false
             }
     return cell
  }

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

    return appDelegate.deviceSize
    //Tried with different sizes CGSize(100,100) - (200,200) and 0 on insets, no difference
 }

////////////////////////////////
//UICollectionViewDelegate
////////////////////////////////
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)
    //do various stuff with selected cell and segue to next view, no issues here

 }

}

希望有人可以告诉我它只需要输入一些设置,因为这个问题似乎是随机的,也许只是UICollectionView的一个错误?无论如何,非常感谢您提前寻求帮助。

1 个答案:

答案 0 :(得分:0)

是的,每次滚动集合视图单元格时这都是正常的,并且再次在屏幕上显示委托被调用。 它正在重新使用。

在cellForItemAtIndexPath中你有

 let bgView = appDelegate.chosenImageArray.objectAtIndex(indexPath.row) as? UIView

以上这一行。 我想在appDelegate.chosenImageArray你有所有的UIViews。

可能的修复 不要将UIView直接存储在数组上,创建一个NSObject模型类并在其中创建所需的属性。

- 尝试创建一个NSObject模型类,它应具有所有相关属性,如UIImage,name等......根据您的要求。 将NSObject类存储在数组中。这里NSObject类是您要存储在数组中的模型类。 现在在委托 cellForItemAtIndexPath -      让bgViewModel = appDelegate.yourModelClassArray.objectAtIndex(indexPath.row)为? yourModelClass

            cell.backgroundView = bgViewModel.bgView

删除cell.hidden = false&amp; cell.backgroundView?.hidden = false它不是必需的。