通过函数 prepare for segue 将数据传递到视图控制器不起作用



我正在尝试使用该函数将数据传递给ViewController:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vc = segue.destination as? ContactTableViewController
    {
        vc.invitationType = type
        print(vc.invitationType)
    }
}

它被称为好,我可以打印vc.invitationType,因此变量已在新的VC中设置。

问题是何时发生。在新的视图控制器中,print(inv)行没有执行,因为invitationType是nil:

class ContactTableViewController: UITableViewController {
    var invitationType: InvitationType?
    override func viewDidLoad() {
        super.viewDidLoad()
        if let inv = invitationType {
            print(inv)
        }
    }
}

谁能解释为什么会发生这种情况?

编辑:我以为我正在使用故事板上定义的segue,但是事实证明,我错误地使用了我的功能来实例化另一个ViewController:

    let newVC = originVC.storyboard?.instantiateViewController(withIdentifier: viewcontroller) as! VC
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.window?.rootViewController = newVC

因此,问题是我最终在一个实例中设置了变量invitationType,然后将其转换为ContactTableViewController的其他实例。

尝试一下,可能已经加载了view,因此在将值设置为invitationType

之前,请调用viewDidLoad
class ContactTableViewController: UITableViewController {
    var invitationType: InvitationType? {
        didSet {
            print(">>> already loaded (invitationType)")
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        if let inv = invitationType {
            print(inv)
        }
    }
}

从评论中,这两个ContactTableViewController并不相同 - 您通过启用了另一个显示的视图控制器来弄乱segue。

最新更新