UICollectionViewCell中的UICollectionView(Swift)

我试图在每个可重用的UICollectionViewCell放置一个UICollectionViewCell 。 Ash Furrow方法对我来说工作不太好,因为使用一个UICollectionViewController类作为数据源,而两个UICollectionViews委托不起作用。

我最近的做法是将UICollectionViewController的视图放入每个单元格中,如本问题和本文档中所述 。 但是,当我去尝试加载视图,我的应用程序冻结。 在Xcodedebugging导航器中,CPU处于常量的107%,几秒钟后内存接近1GB。

在这个例子中,我试图在每个MainCollectionViewControllerCell获取一个ThumbnailCollectionViewController 。 每个ThumbnailCollectionViewControllerCell唯一一个尺寸为50×50的图像。

这是如何正确完成的?

在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被添加到每个缩略图单元格。