93

I got an error message during navigating from first view controller to second view controller. My coding is like this one

let vc = LoginViewController(nibName: "LoginViewController", bundle: nil)
self.navigationController?.pushViewController(vc, animated: true)

The problem is I always got this kind of error message

2014-12-09 16:51:08.219 XXXXX[1351:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/FDC7AA0A-4F61-47E7-955B-EE559ECC06A2/XXXXX.app> (loaded)' with name 'LoginViewController''
*** First throw call stack:
(0x2efcaf0b 0x39761ce7 0x2efcae4d 0x31b693f9 0x31ac1eaf 0x3191e365 0x317fe895 0x318a930d 0x318a9223 0x318a8801 0x318a8529 0x318a8299 0x318a8231 0x317fa305 0x3147631b 0x31471b3f 0x314719d1 0x314713e5 0x314711f7 0x3146af1d 0x2ef96039 0x2ef939c7 0x2ef93d13 0x2eefe769 0x2eefe54b 0x33e6b6d3 0x3185d891 0x4ccc8 0x4cd04 0x39c5fab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
Eric Aya
  • 69,473
  • 35
  • 181
  • 253
Nurdin
  • 23,382
  • 43
  • 130
  • 308

20 Answers20

149

I already found the answer

Swift 4

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "nextView") as! NextViewController
self.present(nextViewController, animated:true, completion:nil)

Swift 3

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)
buczek
  • 2,011
  • 7
  • 29
  • 40
Nurdin
  • 23,382
  • 43
  • 130
  • 308
49

Try this one. Here "LoginViewController" is the storyboardID specified in storyboard.

See below

let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as LoginViewController
self.navigationController?.pushViewController(secondViewController, animated: true)
Rajesh Loganathan
  • 11,129
  • 4
  • 78
  • 90
user2885077
  • 702
  • 6
  • 14
  • I was surprised that Nurdin's answer was suggested to work (and it didn't) because it was just calling push. This of course LOOKS like it should work since we're dealing with the navigation controller – Allison Dec 26 '17 at 16:58
44

XCODE 8.2 AND SWIFT 3.0

Present an exist UIViewController

let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.present(loginVC, animated: true, completion: nil)

Push an exist UIViewController

let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.navigationController?.pushViewController(loginVC, animated: true)

Remember that you can put the UIViewController Identifier following the next steps:

  • Select Main.storyboard
  • Select your UIViewController
  • Search the Utilities in the right
  • Select the identity inspector
  • Search in section identity "Storyboard ID"
  • Put the Identifier for your UIViewController

enter image description here

kkakkurt
  • 2,790
  • 1
  • 30
  • 33
Cristian Mora
  • 1,813
  • 2
  • 19
  • 27
  • 1
    True answer, i voted up but why we need "Restoration ID" ? I believe "Storyoard ID" is enough for this situation. – Yucel Bayram Jan 29 '18 at 13:10
  • Thank for your feedback @yucelbayram A restoration identifier is a string that you need to assign to any view controller or view that you want preserved and restored. In my case, i use this field because i need for determinate function however if you isn't need it can you remove. – Cristian Mora Jan 30 '18 at 14:04
17

If you want to navigate to Controller created Programmatically, then do this:

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

If you want to navigate to Controller on StoryBoard with Identifier "newViewController", then do this:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)
jaiswal Rajan
  • 4,641
  • 1
  • 27
  • 16
13

Swift3:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController("LoginViewController") as UIViewController
self.navigationController?.pushViewController(vc, animated: true)

Try this out. You just confused nib with storyboard representation.

Arif Fikri Abas
  • 836
  • 5
  • 9
11

You can move from one scene to another programmatically using below code :

  let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

  let objSomeViewController = storyBoard.instantiateViewControllerWithIdentifier(“storyboardID”) as! SomeViewController

  // If you want to push to new ViewController then use this
  self.navigationController?.pushViewController(objSomeViewController, animated: true)

  // ---- OR ----

  // If you want to present the new ViewController then use this
  self.presentViewController(objSomeViewController, animated:true, completion:nil) 

Here storyBoardID is value that you set to scene using Interface Builder. This is shown below :

Screenshot for how to set storyboardID

Jayprakash Dubey
  • 35,723
  • 18
  • 170
  • 177
10

See mine.

func actioncall () {
    let loginPageView = self.storyboard?.instantiateViewControllerWithIdentifier("LoginPageID") as! ViewController
    self.navigationController?.pushViewController(loginPageView, animated: true)
}

If you use presenting style, you might lose the page's navigation bar with preset pushnavigation.

Dimuth
  • 713
  • 2
  • 11
  • 34
Alvin George
  • 14,148
  • 92
  • 64
8

Programmatically there are different ways based on different situations

  1. load storyenter code hereboard nib file

    let yourVc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "YourViewController") as! YourViewController;
    self.present(yourVc, animated: true, completion: nil)
    
  2. Load from xib

    let yourVc = YourViewController.init(nibName: "YourViewController", bundle: nil)
    self.present(yourVc, animated: true, completion: nil)
    
  3. Navigate through Segue

    self.performSegue(withIdentifier: "your UIView", sender: self)
    
Asad Ali Choudhry
  • 4,985
  • 4
  • 31
  • 36
Bhanu
  • 1,249
  • 10
  • 17
3
let VC1 = self.storyboard!.instantiateViewController(withIdentifier: "MyCustomViewController") as! ViewController
let navController = UINavigationController(rootViewController: VC1)
self.present(navController, animated:true, completion: nil)
Benjamin RD
  • 11,516
  • 14
  • 87
  • 157
3

XCODE 9.2 AND SWIFT 3.0

ViewController to NextViewcontroller without Segue Connection

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.navigationController?.pushViewController(nextViewController, animated:true)

or

let VC:NextViewController = storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.navigationController?.pushViewController(VC, animated: true)
coderdark
  • 1,481
  • 14
  • 30
2

You can do navigation between view controllers using code with the help of storyboard and storyboardId of the view controller. This code is for Swift 3:

let signUpVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp")
self.navigationController?.pushViewController(signUpVC, animated: true)
Krishna Vivekananda
  • 257
  • 1
  • 5
  • 11
  • Is there any introduction or explanation you can think of for the code in your answer? Perhaps a first sentence like "I think you want code like this:". – Louis Langholtz Mar 25 '17 at 16:45
2

In addition to the good answers above to set the navigation view controller on top of your screen on your app, you can add it to your AppDelegate.swift file inside the block as follows

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    window = UIWindow()
    window?.makeKeyAndVisible()
    window?.rootViewController = UINavigationController(rootViewController: LoginViewController())

    return true

}
Vega
  • 27,856
  • 27
  • 95
  • 103
Ahmad Al-Baqawi
  • 189
  • 1
  • 7
2
 let vc = DetailUserViewController()
 vc.userdetails = userViewModels[indexPath.row]
 self.navigationController?.pushViewController(vc, animated: true)
Sanjay Mali
  • 506
  • 6
  • 13
1

I'm not sure try below steps,i think may be error occurs below reasons.

  • you rename some files outside XCode. To solve it remove the files from your project and re-import the files in your project.
  • check and add missing Nib file in Build phases->Copy bundle resources.finally check the nib name spelling, it's correct, case sensitive.
  • check the properties of the .xib/storyboard files in the file inspector ,the property "Target Membership" pitch on the select box,then your xib/storyboard file was linked with your target.
  • such as incorrect type of NIB.Right click on the file and click "Get Info" to verify that the type is what you would expect.
Dharma
  • 3,007
  • 3
  • 23
  • 38
1

I Give you my code to make a transition. In this example the action is connecting to an UIButton. So don't forget to set it. Don't forget to set the name of your ViewController in the transition method.

Don't forget to set your storyboard too. Your need to have one view per viewController. Connect each ViewController to each view in storyBoard. You can see on the screenshoot bellow

enter image description here enter image description here

class PresentationViewController: UIViewController {
    override func viewDidLoad() {
         super.viewDidLoad()

         var playButton   = UIButton.buttonWithType(UIButtonType.System) as UIButton

         let image = UIImage(named: "YourPlayButton") as UIImage?

         playButton.frame = CGRectMake(0, 0, 100, 100)
         playButton.center = CGPointMake(self.view.frame.width/2, self.view.frame.height/2)
         playButton.addTarget(self, action: "transition:", forControlEvents:  UIControlEvents.TouchUpInside)
         playButton.setBackgroundImage(image, forState: UIControlState.Normal)

         self.view.addSubview(playButton)
    }


func transition(sender:UIButton!)
{
    println("transition")
    let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("YourSecondViewController") as UIViewController

    let window = UIApplication.sharedApplication().windows[0] as UIWindow
    UIView.transitionFromView(
        window.rootViewController!.view,
        toView: secondViewController.view,
        duration: 0.65,
        options: .TransitionCrossDissolve,
        completion: {
            finished in window.rootViewController = secondViewController
    })
}
}
Haox
  • 608
  • 1
  • 7
  • 23
1

If you are building UI without drag and drop (without using storyboard) and want to navigate default page or ViewController.swift to another page? Follow these steps 1) add a class (.swift) 2) Import UIKit 3) Declare class name like

class DemoNavigationClass :UIViewController{
     override func viewDidLoad(){
         let lbl_Hello = UILabel(frame: CGRect(x:self.view.frame.width/3, y:self.view.frame.height/2, 200, 30));
lbl_Hello.text = "You are on Next Page"
lbl_Hello.textColor = UIColor.white
self.view.addSubview(lbl_Hello)
    }
}

after creating second page come back to first page (ViewController.swift) Here make a button in viewDidLoad method

let button = UIButton()
button.frame = (frame: CGRect(x: self.view.frame.width/3, y: self.view.frame.height/1.5,   width: 200, height: 50))
 button.backgroundColor = UIColor.red
 button.setTitle("Go to Next ", for: .normal)
 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
 self.view.addSubview(button)

now define buttonAction method outside of viewDidLoad() in same class

func buttonAction(sender: UIButton!) 
{
    let obj : DemoNavigationClass = DemoNavigationClass();
    self.navigationController?.pushViewController(obj, animated: true)
}

Keep one thing that i forget in main.storyboard there is a scene with a arrow, select that arrow and press delete button

now drag and drop a navigationcontroller and delete tableview which comes with navaigation controller. select navigationcontroller press control on keyboard and drag it in to another scene on storyboard that is ViewController. This mean that your viewcontroller become root viewcontroller hope this help you Thanks in main.storyboard , drag and drop navigationcontroller,

Dilip Jangid
  • 754
  • 1
  • 10
  • 20
1
let signUpVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp")
// self.present(signUpVC, animated: false, completion: nil)
self.navigationController?.pushViewController(signUpVC, animated: true)
aircraft
  • 25,146
  • 28
  • 91
  • 166
Sai kumar Reddy
  • 1,751
  • 20
  • 23
1

Swift 4.0.3

 @IBAction func registerNewUserButtonTapped(_ sender: Any) {

        print("---------------------------registerNewUserButtonTapped --------------------------- ");

        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

        let nextViewController = storyBoard.instantiateViewController(withIdentifier: "RegisterNewUserViewController") as! RegisterNewUserViewController
        self.present(nextViewController, animated:true, completion:nil)

    }

Change our Controller Name RegisterNewUserViewController

Keshav Gera
  • 10,807
  • 1
  • 75
  • 53
1

I think you are looking for something like this:

let signUpViewController = SignUpViewController()
present(signUpViewController, animated: true, completion: nil)

If you want full screen of the new page:

present(signUpViewController, animated: true, completion: nil)

Hope this helps :)

0
let vc = storyboard?.instantiateViewController(withIdentifier: "make sure you give id to screen")as! screenviewclass
        self.navigationController?.pushViewController(vc, animated: true)
  • You told me we have to add "Storyboard ID" to the viewController as this answer said. https://stackoverflow.com/questions/24035984/instantiate-and-present-a-viewcontroller-in-swift Thanks! – kujiy Mar 12 '23 at 14:12