david
david

Reputation: 666

How to show different view controller on did select of collectionv view cell

I have 3 view controllers called firstvc, secondvc, thirdvc. And I have one collection view which will scroll horizontally. I have done that. And if I select any cell, it will print which index path it was. It's fine, no problem. So in my mainviewcontroller I have one collection view which will scroll horizontally. And there is one UIView called myview. Whenever I press any cell, I get its indexPath. I need to show my 3 view controllers as subviews of myview in my mainviewcontroller.

My code so far:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    // handle tap events
    print("You selected cell #\(indexPath.item)!")
    if indexPath.item == 0 {
         let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
         if let allCollectionViewController = alertStoryBoard.instantiateViewController(withIdentifier:"firstvc") as? firstvc {
             self.contentSubView.addSubview(allCollectionViewController)
         } else if indexPath.item == 1 {
            
         } else if indexPath.item == 2 {
            
         }
    }
}

I am getting error on this line :

 self.contentSubView.addSubview(allCollectionViewController)

Cannot convert value of type 'firstvc' to expected argument type 'UIView'

How do i solve this issues.

Thanks in advance !!

UPDATED:

if indexPath.item == 0 {

    let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
    
    
    if  let allCollectionViewController = alertStoryBoard.instantiateViewController(withIdentifier:"firstvc") as? firstvc  {
        
       
        
          self.contentSubView.addSubview(allCollectionViewController.view)
        

    
    
} else if indexPath.item == 1 {
        
        
        let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
        
        
        if  let allCollec = alertStoryBoard.instantiateViewController(withIdentifier:"secondvc") as? secondvc  {
       
            self.contentSubView.addSubview(allCollec.view)

    
}else if indexPath.item == 2 {
       
            let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
            
            
            if  let wController = alertStoryBoard.instantiateViewController(withIdentifier:"Thirdvc") as? Thirdvc  {
       
                self.contentSubView.addSubview(wController.view)

}

Only showing first vc class alone, not showing second and third one. Also, why i am following lk this means. When ever i press on any collection view cell, that particular class view controlelr have to show in my sub view of uiview in my mainviewcontroller

In my first view controller i placed one uiview with some background color .But that not at all showing .Its showing whitee color.That too not showing correctly

Upvotes: 0

Views: 2285

Answers (4)

Anbu.Karthik
Anbu.Karthik

Reputation: 82759

do like

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// handle tap events
print("You selected cell #\(indexPath.item)!")

    based on your comment remove the subviews before add on your myview

    for subview in contentSubView.subviews {
          subview.removeFromSuperview()
    }

    let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
    var controller: UIViewController!

if indexPath.item == 0 {

    if  let allCollectionViewController = alertStoryBoard.instantiateViewController(withIdentifier:"firstvc") as? firstvc  {

        controller = allCollectionViewController
      }

} else if indexPath.item == 1 {

        if  let allCollec = alertStoryBoard.instantiateViewController(withIdentifier:"secondvc") as? secondvc  {
       controller = allCollec
       }


}else if indexPath.item == 2 {


            if  let wController = alertStoryBoard.instantiateViewController(withIdentifier:"Thirdvc") as? Thirdvc  {
       controller = wController
    }

}

   addChildViewController(controller)

 // Add the child's View as a subview
  contentSubView.addSubview(controller.view)
  controller.view.frame = contentSubView.bounds
  controller.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

  // tell the childviewcontroller it's contained in it's parent
   controller.didMove(toParentViewController: self)
}

Upvotes: 0

Swifty Codes
Swifty Codes

Reputation: 1102

//Do this:

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "someViewController")
self.present(controller, animated: true, completion: nil)

//You have to present your view controller and what you are doing is adding it as a sub view.

Upvotes: 1

Pranav Kasetti
Pranav Kasetti

Reputation: 9915

The error is very obvious. You can only use addSubview according to this definition:

open func addSubview(_ view: UIView)

If you want to use multiple view controllers in one view controller, I would recommend using container view controllers.

Try this tutorial: https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/

Otherwise a simple approach is to use:

self.contentSubView.addSubview(allCollectionViewController.view)

You can then use constraints on the view to manage multiple view controllers.

Upvotes: 0

Ketan Parmar
Ketan Parmar

Reputation: 27428

you can push present viewcontroller but you can't add viewcontroller as subview.

If you want to add as subview then you can do like,

  self.contentSubView.addSubview(allCollectionViewController.view)

or push viewcontroller if you have navigation controller like

 navigationController?.pushViewController(allCollectionViewController, animated: true)

or present it like

 present(allCollectionViewController, animated: true) { 

    }

Upvotes: 1

Related Questions