Present View Controller in Storyboard with a Navigation Controller - Swift

75,640

Solution 1

You're definitely on the right track. Unfortunately when you reference a view controller by its storyboard ID it will ignore the fact it is embedded within anything. Same goes for segues when you segue to something embedded, the destination view controller will be the embedding controller, not the controller you're usually interested in. Anyhow, you should be able to fix the problem in a similar way you've done in Objective-C, so this is just an exercise in syntax porting.

Edit: Define storyboard name with string now

let storyboard : UIStoryboard = UIStoryboard(name: "AccountStoryboard", bundle: nil)
let vc : WelcomeViewController = storyboard.instantiateViewControllerWithIdentifier("WelcomeID") as WelcomeViewController
vc.teststring = "hello"        

let navigationController = UINavigationController(rootViewController: vc)

self.presentViewController(navigationController, animated: true, completion: nil)

OR you can give your embedding view controller an ID and instantiate that instead.

Solution 2

 let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("WelcomeID") as SecondViewController

        self.navigationController?.pushViewController(secondViewController, animated: true)

Class Name is : SecondCiewController

Identifier Name

Solution 3

The answer given by @Chris is works good in older version of swift.

Update Swift 3 & Swift 4

   let storyboard : UIStoryboard = UIStoryboard(name: "AccountStoryboard", bundle: nil)
   let vc : WelcomeViewController = storyboard.instantiateViewController(withIdentifier: "WelcomeID") as! WelcomeViewController
   vc.teststring = "hello"

   let navigationController = UINavigationController(rootViewController: vc)

   self.present(navigationController, animated: true, completion: nil)

Thanks!!!

Share:
75,640

Related videos on Youtube

Ryan
Author by

Ryan

Updated on July 09, 2022

Comments

  • Ryan
    Ryan almost 2 years

    I am currently showing a viewController in my new storyboard below:

    var storyboard : UIStoryboard = UIStoryboard(name: AccountStoryboard, bundle: nil)
    var vc : WelcomeViewController = storyboard.instantiateViewControllerWithIdentifier("WelcomeID") as WelcomeViewController
    vc.teststring = "hello"        
    self.presentViewController(vc, animated: true, completion: nil)
    

    However, this presents the viewcontroller without its embedded navigation controller. I tried changing "WelcomeID" to the navigation controller within the storyboard - however to no success.

    I got this working in Objective -C, however don't know how to transform into swift:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SetupStoryboard" bundle:nil];
    UINavigationController *navigationController1 = [storyboard instantiateInitialViewController];
    navigationController1.modalPresentationStyle = UIModalPresentationFormSheet;
    navigationController1.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    
    WelcomeViewController *vc = (WelcomeViewController *)navigationController1.viewControllers[0];
    vc.teststring = @"Hello";
    
    [self presentViewController:navigationController1 animated:YES completion:nil];
    

    How can you do this in swift?

  • shreddish
    shreddish over 8 years
    what if the destination ViewController isn't the direct rootView controller to the nav controller? I am getting the navigation pane but its theres no button back to the previous ViewController that its connected to.
  • Chris Wagner
    Chris Wagner over 8 years
    I'm not understanding the question.
  • shreddish
    shreddish over 8 years
    I'm sorry I ended up figuring it out... I wanted to pop back to the root view controller of the navigation stack and then push to another view controller. I appreciate you getting back to me though
  • SKYnine
    SKYnine over 8 years
    how did you manage to get the back button on the instanciated controller? ==> answer: self.navigationController?.pushViewController(secondViewCont‌​roller, animated: true)
  • kosiara - Bartosz Kosarzycki
    kosiara - Bartosz Kosarzycki over 8 years
    note: remember to always wrap the ViewController with NavigationController and only after that pass it to the method self.presentViewController(navigationController, animated: true, completion: nil)
  • Aditya A.Rajan
    Aditya A.Rajan over 5 years
    here "SalesVC" can be your ViewController that you are trying to move onto through the navigation controller