Swift presentViewController

I programatically have multiple View Controllers in an iOS Swift Project. I do not have the storyboards and would like to avoid them if possible. Is there a way to switch to another viewcontroller.swift file (We will call it view2.swift) and have it be part of a function that a button calls?
I have tried the following:

let storyboard: UIStoryboard = UIStoryboard(name: "myTabBarName", bundle: nil)
let vc: UIViewController = storyboard.instantiateViewControllerWithIdentifier("myVCID") as UIViewController
self.presentViewController(vc, animated: true, completion: nil)

The above works with storyboards, but I want another view2.swift to be called. Can this be done?

  • How to do layout to handle in-call (double-height) status bar for custom presented view controller in iOS 8?
  • Can I deploy apps with iOS 8 extensions to devices running iOS 7?
  • UISearchBar - ReturnKeyType not working for iOS 8
  • How to List discoverable Bluetooth devices and already paired devices in iOS, which method to use in swift?
  • Load UIImage in background Thread
  • Attributed string with custom fonts in storyboard does not load correctly
  • 11 Solutions Collect From Internet About “Swift presentViewController”

    Try this:

    let vc = ViewController() //change this to your class name
    self.presentViewController(vc, animated: true, completion: nil)
    

    With Swift3:

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

    For those getting blank/black screens this code worked for me.

    let vc = self.storyboard?.instantiateViewControllerWithIdentifier("myVCId") as! MyVCName
    self.presentViewController(vc, animated: true, completion: nil)
    

    To set the “Identifier” to your VC just go to identity inspector for the VC in the storyboard. Set the ‘Storyboard ID’ to what ever you want to identifier to be. Look at the image below for reference.

    For reference, because this question is one of the first Google result.

    Breaking change in Swift 3:

    The method presentViewController is replaced by the method present.

    You can use it like the old one:

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

    Example to open the camera:

    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = UIImagePickerControllerSourceType.camera
    imagePicker.allowsEditing = false
    self.present(imagePicker, animated: true, completion: nil)
    

    Using Swift 2.1+

     let vc = self.storyboard?.instantiateViewControllerWithIdentifier("settingsVC") as! SettingsViewController
     self.presentViewController(vc, animated: true, completion: nil)
    

    enter image description here

    Swift 3

    let vc = self.storyboard?.instantiateViewController(withIdentifier: "idMyViewControllerName") as! MyViewControllerName
    self.present(vc, animated: true, completion: nil)
    

    For me, I had two views in two separate nav controllers. I had to use a combination of the above.

    var vc = self.storyboard?.instantiateViewControllerWithIdentifier("WelcomeViewController") as! WelcomeViewController
        var navigationController = UINavigationController(rootViewController: vc)
        self.presentViewController(navigationController, animated: true, completion: nil)
    

    Swift 3.x

            let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "VC-ID" as! yourViewController
            let navigationVC = UINavigationController(rootViewController: secondVC)
            self.present(navigationVC, animated: true, completion: nil)
    

    Just use this : Make sure using nibName otherwise preloaded views of xib will not show :

    var vc : ViewController = ViewController(nibName: "ViewController", bundle: nil) //change this to your class name

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

    Solved the black screen by adding a navigation controller and setting the second view controller as rootVC.

    let vc = ViewController()       
    var navigationController = UINavigationController(rootViewController: vc)
    self.presentViewController(navigationController, animated: true, completion: nil
    

    You can use below code :

    var vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController;
                vc.mode_Player = 1
                self.presentViewController(vc, animated: true, completion: nil)
    

    Another possibility is that you do not have the XIB included in your Build target (which is what happened to me).

    This could happen if you have a different target for Dev, Test & Release Builds (which you should have anyway).

    You can use code:

    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? secondViewController {
       let appDelegate = UIApplication.shared.delegate as! AppDelegate
       appDelegate.window?.rootViewController = vc
    }