markhorrocks
markhorrocks

Reputation: 1418

Can't push from programmatically created UINavigationController

In a Swift 3 project using Xcode 8.3 and iOS 10.3, I get a navigation controller to push. The app runs with a navigation controller until I try to use it to push. All works until the last line which cause an app crash, fatal error: unexpectedly found nil while unwrapping an Optional value. I don't want to use the storyboard, the point of this question is how to accomplish this task without the storyboard.

App Delegate code

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

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

        window = UIWindow(frame: UIScreen.main.bounds)

        window?.makeKeyAndVisible()

        window?.rootViewController = UINavigationController(rootViewController: MainViewController())

}

View Controller:

import UIKit

class MainViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white

        let navController = navigationController

        let myProfileViewController = MyProfileViewController()

        navController!.pushViewController(myProfileViewController, animated: true)

    }
}        

Upvotes: 1

Views: 536

Answers (3)

Sulthan
Sulthan

Reputation: 130102

Move

let navController = navigationController
let myProfileViewController = MyProfileViewController()

navController!.pushViewController(myProfileViewController, animated: true)

from viewDidLoad to viewDidAppear.

In viewDidLoad there is no parent navigation controller set up and you should not start animations from there.

Upvotes: 2

adam
adam

Reputation: 193

first give name to your navigation controller like this enter image description here

then in your code initialise it like this let nav = (UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "yourNavigation") as! UINavigationController); nav.pushFrontViewController(MainViewController(), animated: true); window?.rootViewController = nav

Upvotes: 0

Jack
Jack

Reputation: 14329

You can add navigation controller in storyboard, in Storyboard click on MainViewController & from editor menu add navigation controller & push via navigation controller as below code.

  let vc = self.storyboard?.instantiateViewController(withIdentifier: "MyProfileViewController") as! MyProfileViewController
    self.navigationController?.pushViewController(vc, animated: true)

Make sure storyboard identifier is correct. & remove navigation controller code form AppDelegate class.

Upvotes: 0

Related Questions