Search code examples
swiftuistoryboardsegue

Swift: my destinationVC segue is showing nil


I'm having users fill out some profile information via texts fields (name, email, etc.), which is used to set my ProfileContoller.shared.profile values. When I get to my navigation segue to pass the data over, my destinationVC.profile will not set its value to the sending profile object and I get nil instead.

My sendingVC is embedded in a navigation controller, while my destinationVC is embedded in Tab Bar Controller.

Segue SendingVC

Attributes Inspector SendingVC

DestinationVC

// Sending View Controller: 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let profile = ProfileController.shared.profile else { return }
    if segue.identifier == "signUpMemicTBC" {
        let destinationVC = segue.destination as? ProfileViewController
        destinationVC?.profile = profile

// Receiving ProfileViewController:
class ProfileViewController: UIViewController {

    // MARK: - IBOutlets
    @IBOutlet weak var fullNameLabel: UILabel!
    @IBOutlet weak var usernameLabel: UILabel!
    @IBOutlet weak var emailLabel: UILabel!

    // MARK: - Landing Pad
    var profile : Profile? {
        didSet {
            updateViews()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        updateViews()
    }

    func updateViews () {
        guard let profile = profile else { return }
        fullNameLabel.text = profile.firstName + " " + profile.lastName
        usernameLabel.text = profile.username
        emailLabel.text = profile.email
    }
}

// ProfileController:
class ProfileController {

    // MARK: - Properties
    var profile : Profile?

    // MARK: - Singleton
    static let shared = ProfileController()

}

My sending object has data: (lldb) po profile Profile: 0x600000c873c0

The destination object is unexpectedly nil: (lldb) po destinationVC?.profile nil


Solution

  • didSet triggers while your vc in segue isn't loaded yet so all outlets are nil

    you need to put updateViews() inside viewDidLoad


    Plus your destination is a tabBar

    let tab = segue.destination as! UITabBarController
    let destinationVC = tab.viewControllers![2] as! ProfileViewController