【问题标题】:Why is my prepareForSegue method not being called?为什么我的 prepareForSegue 方法没有被调用?
【发布时间】:2026-01-09 01:45:02
【问题描述】:

当我按下此导航控制器中的后退按钮时,我想将开关的状态发送到不同视图控制器中的变量。但是,没有调用 prepareForSegue 方法。我该如何解决这个问题?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    print("here")
    let secondViewController:ViewController2 = segue.destination as! ViewController2

    if undoSwitch.isOn {
        secondViewController.undoControls[0] = true
    }
    else {
     secondViewController.undoControls[0] = false
    }
}

【问题讨论】:

    标签: ios swift uinavigationcontroller uistoryboardsegue


    【解决方案1】:

    返回按钮不同于segue。如果您想在从当前视图控制器返回时重新加载 undoSwitch。其中一种方法是使用静态全局变量。类似的东西

    class AppVar {
        static var controlState = true
    }
    

    在您需要的地方更新您的 AppVar.controlState 并添加它

    if AppVar.controlState {
        secondViewController.undoControls[0] = true
    }
    else {
         secondViewController.undoControls[0] = false
    }
    

    ViewController2viewWillAppear,因为ViewController2 被保留并存储在堆栈中。当您导航回它时,viewWillAppear 将被调用。

    【讨论】:

    • 我认为我无法访问开关的状态,因为它们不在 secondViewController 中。
    【解决方案2】:

    重写你的self.navigationItem.leftBarButtonItem,添加一个动作,然后做任何你想做的事。 或者使用https://github.com/onegray/UIViewController-BackButtonHandler

    【讨论】:

      【解决方案3】:

      如果您想从 ViewControllerA 向 ViewControllerB 发送数据,您可以使用 prepare for segue 方法或实例化 ViewControllerB 故事板 id 传递数据并访问其属性并传递数据。

      如果您想反之亦然,即将数据从 ViewControllerB 传递回 ViewControllerA,您可以使用各种模式。委托、通知、Kvo 或使用 NSUserDefaults。

      在您的情况下,委托模式将是最好的。将 ViewController2 分配为当前类的委托。并使用当前类的协议传递数据(在您的案例控制状态下)。在 ViewController2 中实现协议和开关的访问控制状态并相应地执行。你可以参考我之前关于这个主题的ans。看here我在Objective-C中的详细答案。 希望能帮助到你。快乐编码!

      【讨论】:

      • 我想我有更好的解决方案。我只是将变量 undoControls 移到了类之外。现在,我可以在任何需要的地方轻松访问它,因为它是公开的。有什么理由说明这不是一个好主意吗?
      最近更新 更多