UICollectionView dans un UICollectionViewCell (Swift)

UICollectionView de mettre un UICollectionView dans chaque UICollectionViewCell réutilisable. La méthode Ash Furrow ne fonctionnait pas très bien pour moi, car l'utilisation d'une class UICollectionViewController pour la source de données et le délégué de deux UICollectionViews ne fonctionnait pas.

Ma dernière approche consiste à placer la vue d'un UICollectionViewController à l'intérieur de chaque cellule, comme décrit dans cette question et dans ce document . Cependant, quand je vais essayer de charger la vue, mon application se fige. Dans le browser de debugging Xcode, le processeur est à une constante de 107% et la memory approche 1 Go après quelques secondes.

Dans cet exemple, j'essaie d'get un ThumbnailCollectionViewController dans chaque MainCollectionViewControllerCell . La seule chose dans chaque ThumbnailCollectionViewControllerCell est une image de taille 50×50.

Comment est-ce fait correctement?

Dans 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 } 

Votre approche pour placer un UICollectionView à l'intérieur de chaque cellule semble bien, mais vous risquez de voir des performances atroces car vous manipulez mal la cellule. Vous ajoutez une nouvelle vue de collection à la cellule (et en fait, une nouvelle vue d'image à chaque cellule de vignette) CHAQUE fois qu'une nouvelle cellule réutilisable est demandée. Si vous faites défiler en continu, alors les cellules qui seront déjà ajoutées à ces sous-vues seront supprimées, de sorte que vous obtiendrez de nombreuses sous-vues dans chaque cellule.

Au lieu de cela, ajoutez un moyen de vérifier si une cellule a déjà la sous-vue ou non, et ne l'ajoutez que si ce n'est pas le cas. Probablement le meilleur moyen est en utilisant une sous-class de cellule personnalisée:

 class ThumbnailCollectionCell: UICollectionViewCell { var thumbnailViewController: ThumbnailCollectionViewController? } 

De return dans votre 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 } } 

Et encore une fois, quelque chose de similaire pour empêcher l' UIImageView plusieurs UIImageView à chaque cellule de vignette.