Search code examples
swiftuikit

view controller's navigation controller property is nil after being pushed


I am trying to understand why a) vc2's navController property is nil, and b) why the nav controller vc stack does not have vc2.

import UIKit

let vc1 = UIViewController()

let navController1 = UINavigationController(rootViewController: vc1)

print(navController1.viewControllers) // prints vc1
print(vc1.navigationController) // prints navController1

let vc2 = UIViewController()

navController1.pushViewController(vc2, animated: true)

print(navController1.viewControllers) // prints only vc1. Hmmm

print(vc2.navigationController) // prints nil


Solution

  • Timing...

    let vc1 = UIViewController()
    
    let navController1 = UINavigationController(rootViewController: vc1)
    
    print(navController1.viewControllers) // prints vc1
    print(vc1.navigationController) // prints navController1
    
    let vc2 = UIViewController()
    
    // animated: true !!!!
    navController1.pushViewController(vc2, animated: true)
    
    // next two lines execute BEFORE the above line finishes
    print(navController1.viewControllers) // prints only vc1. Hmmm
    
    print(vc2.navigationController) // prints nil
    

    Change animated to false:

    // animated: false !!!!
    navController1.pushViewController(vc2, animated: false)
    

    and you'll see what you were expecting to see.