How to show different view controller on did selec

2019-06-13 05:56发布

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

4条回答
Anthone
2楼-- · 2019-06-13 05:57

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) { 

    }
查看更多
啃猪蹄的小仙女
3楼-- · 2019-06-13 05:58

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)
}
查看更多
贪生不怕死
4楼-- · 2019-06-13 06:06

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.

查看更多
Rolldiameter
5楼-- · 2019-06-13 06:22
//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.
查看更多
登录 后发表回答