performSegue 创建两个视图控制器

performSegue creates two view controllers

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    self.delegate = segue.destination as? MenuViewController
    print("check_1", self.delegate)
}


@IBAction func openMenu(_ sender: Any) {
    performSegue(withIdentifier: "openMenu", sender: sender)
    print("check_2", self.delegate)
}

我的主要 ViewController 更新值,而 MenuViewController 显示这些值。每次 ViewController 值更新时,它都会在 MenuViewController 中调用 self.delegate.updateValues。我通过按钮在两个 ViewControllers 之间切换。

我的问题是显示的 MenuViewController 似乎与 ViewControllerself.delegate 中存储的对象不同。打印检查语句:

check_1 Optional(<Menu.MenuViewController: 0x10161ca10>)
check_2 Optional(<Menu.MenuViewController: 0x10161ca10>)
check_1 Optional(<Menu.MenuViewController: 0x10161dd10>)

请问如何确保只创建一个 MenuViewController 实例并将其存储在 self.delegate 中?

当你向故事板添加转场时,如果你将转场连接到特定按钮/IBAction,你不需要手动调用performSegue,它会自动调用给你。

您执行了 2 个转场,因为故事板都执行转场,然后您也通过调用 performSegue.

从代码中执行转场

performSegue 只应在您的 segue 未直接连接到 UI 事件时使用,或者如果您需要有条件地执行 segue - 例如当您有登录按钮时,根据网络响应,您可能会执行错误或登录 segue。