Oreex0
Oreex0

Reputation: 324

iOS Use multiple CollectionView reusing the same cell

I'm new to iOS programming but from my experience with Android i know that you can create one design for a item that can be reused in multiple lists, without needing to create a copy.

In iOS i have been trying the same approach with UICollectionView.

In my view i have created three Horizontal UICollectionViews (with different data sets) which in turn use their own cell (Which is identical to the others). I don't know how to make the other two collections use the first ones cell, so i don't need to recreate the same cell over and over.

Upvotes: 2

Views: 3120

Answers (4)

vinothp
vinothp

Reputation: 10069

Create a Swift class(CollectionViewCell) by having UICollectionViewCell as a base class. Select create nib option while doing that.

Then create a view controller and add collection view to it in your storyboard and hook up this custom cell class in Identity Inspector. Basically, your structure needs to look like below

enter image description here

Upvotes: 0

Keuha
Keuha

Reputation: 295

In your function collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell you can inform your collectionview which cell to use

if you have define your cell you might have something similar to this

 class MyCell: UICollectionViewCell{
    var Label: UILabel!
    var imageView: UIImageView!
}

so into your function collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) you need to inform your collectionview which cell to use

collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
 let cell:MyCell = collectionView.dequeueReusableCellWithReuseIdentifier("myCell", forIndexPath: indexPath) as! MyCell
[...]
}

and dont forget to register your cell first

override func viewDidLoad() {        
        super.viewDidLoad()
        //do your stuff
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.backgroundColor = UIColor.whiteColor()
        collectionView.registerClass(MyCell.self, forCellWithReuseIdentifier: "myCell")
}

and Voila !

Upvotes: 1

Nikita Patskov
Nikita Patskov

Reputation: 457

You can't achieve this using single storyboard. If you want to use Interface Builder (xml) file for layout, you should create MyCell.xib file, then drag UICollectionViewCell on that file and work with that xib. Then you should connect .xib file with your collection view like this: let nib = UINib(nibName: "MyCell", bundle: nil) collectionView?.register(nil, for: "MyCellReuseID") And you can work with your cell now.

Also you can create MyCell: UICollectionViewCell class without creating .xib file, create views on it programmatically and then call collectionView?.register(MyCell.self, for: "MyCellReuseID")

Upvotes: 2

Bilal Awan
Bilal Awan

Reputation: 5370

  1. Create new file collection cell with XIB
  2. In your "item at row for index" delegate method in view controller, initialize cell and return it.
  3. Now any collection view within you view controller have the same cell

Upvotes: 0

Related Questions