UICollectionViewCell 中的 UICollectionView (Swift)

UICollectionView within a UICollectionViewCell (Swift)

我正在尝试在每个可重复使用的 UICollectionViewCell 中放置一个 UICollectionViewAsh Furrow 方法对我来说效果不太好,因为使用一个 UICollectionViewController class 作为数据源和两个 UICollectionViews 的委托不起作用。

我最新的方法是在每个单元格中放置一个 UICollectionViewController 的视图,如 this question and this doc 中所述。但是,当我尝试加载视图时,我的应用程序冻结了。在 Xcode 调试导航器中,CPU 处于恒定的 107%,几秒钟后内存接近 1GB。

在这个例子中,我试图在每个 MainCollectionViewControllerCell 中得到一个 ThumbnailCollectionViewController。每个 ThumbnailCollectionViewControllerCell 中唯一的东西是一张尺寸为 50x50 的图像。

这是如何正确完成的?

在 MainCollectionViewController

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UICollectionViewCell

    let thumbsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ThumbnailColllection") as! ThumbnailCollectionViewController
    self.addChildViewController(thumbsViewController)
    thumbsViewController.view.frame = cell.bounds
    cell.addSubview(thumbsViewController.view)
    thumbsViewController.didMoveToParentViewController(self)
} 

ThumbnailCollectionViewController

let reuseIdentifier = "ThumbCell"
let thumbnails = ["red", "green", "blue"]

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return thumbnails.count
}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UICollectionViewCell
    let cellImage = UIImage(named: thumbnails[indexPath.row])
    let cellImageView = UIImageView(image: cellImage)
    cellImageView.frame = cell.bounds
    cell.addSubview(cellImageView)

    return cell
}

您在每个单元格中放置 UICollectionView 的方法看起来不错,但您很可能会看到糟糕的性能,因为您对单元格重用处理不当。每次请求新的可重用单元格时,您都会向单元格添加一个新的集合视图(实际上,每个缩略图单元格都会添加一个新的图像视图)。如果您连续滚动,那么 已经 添加了这些子视图的单元格将会出列,因此您最终会在每个单元格下得到许多子视图。

相反,添加一种方法来检查单元格是否已经有子视图,并且只有在没有时才添加它。可能最好的方法是使用自定义单元格子类:

class ThumbnailCollectionCell: UICollectionViewCell {
    var thumbnailViewController: ThumbnailCollectionViewController?
}

回到您的 MainCollectionViewController:

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! ThumbnailCollectionCell
    if cell.thumbnailViewController == nil {
        let thumbsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ThumbnailColllection") as! ThumbnailCollectionViewController
        self.addChildViewController(thumbsViewController)
        thumbsViewController.view.frame = cell.bounds
        cell.addSubview(thumbsViewController.view)
        thumbsViewController.didMoveToParentViewController(self)
        cell.thumbnailViewController = thumbsViewController
    }
}

同样,类似的东西可以防止多个 UIImageView 被添加到每个缩略图单元格。