Search code examples
swiftcollectionsviewsegueviewcontroller

How to Segue from different Collection View Cells to different View Controllers


Beginner here. I am developing a simple fixtures app. I have set up a collection view, I am trying to make it so when I click on a cell in the collection view it takes me to the corresponding view controller. Each cell should segue to a different view controller. Here is the code I have tried so far:

import UIKit

class FixturesViewController: UIViewController, UICollectionViewDataSource,       UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {


let fixturesName = ["EUMHC 1's XI", "EUMHC 2's XI", "EUMHC 3's XI", "EUMHC 4's XI", "EUMHC 5's XI", "EUMHC 6's XI", "EUMHC 7's XI"]

let fixturesLeague = ["Competing in Men's Premiership & Premier North (BUCS)", "Competing in Men's Regional Division 1 & Scottish 1 (BUCS)", "Competing in Men's Regional Division 2 & Scottish 2 (BUCS)", "Competing in Men's East District Division 1 & Scottish 3 (BUCS)", "Competing in Men's East District Division 2 & Scottish 3 (BUCS)", "Competing in Men's East District Division 2 & Scottish 4 (BUCS)", "Competing in Men's East District Division 4"]


override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
       return fixturesName.count
   }



func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell2", for: indexPath) as! FixturesCollectionViewCell

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){
    }

    cell.fixturesName.text = fixturesName[indexPath.row]
    cell.fixturesLeague.text = fixturesLeague[indexPath.row]


    cell.contentView.layer.cornerRadius = 10.0
    cell.layer.cornerRadius = 10.0
    cell.contentView.layer.borderWidth = 1.0
    cell.contentView.layer.borderColor = UIColor.clear.cgColor
    cell.contentView.layer.masksToBounds = true
    cell.layer.shadowColor = UIColor.gray.cgColor
    cell.layer.shadowOffset = CGSize(width: 0, height: 1.0)
    cell.layer.shadowRadius = 4.0
    cell.layer.masksToBounds = false
    cell.layer.shadowOpacity = 1.0

    return cell


}

private func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){

switch (indexPath.row)   {
    case 0:
        self.performSegue(withIdentifier: "fixtures1", sender: self)
    case 1:
        self.performSegue(withIdentifier: "fixtures2", sender: self)
  default:
     break
   }
}
}

I've tried to use a switch statement at the bottom (saw this method elsewhere) to perform segues with identifiers depending on the index of the cell.

Is this the right way to approach it?


Solution

  • If you have many segues , then it's better to build this way

    self.performSegue(withIdentifier: "fixtures\(indexPath.item + 1)", sender: self)
    

    where segues start with fixtures1 to fixturesN