You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:视图控制器初始化与Segue执行顺序及变量值问题

问题1:视图控制器初始化与Segue执行的先后顺序

首先明确一点:视图控制器自身的初始化操作会比Segue的核心执行流程更早发生。

当你触发一个Segue时,系统的执行顺序是这样的:

  • 第一步:系统会先创建目标视图控制器的实例(调用它的初始化方法,比如Storyboard场景下的initWithCoder:,或者代码初始化的init(nibName:bundle:))——这就是VC的初始化操作,是最先启动的。
  • 第二步:调用源视图控制器的prepare(for:sender:)方法,你可以在这里给目标VC传递数据、做配置。
  • 第三步:完成Segue的转场动画,把目标VC显示在界面上。

所以总结:VC初始化是Segue执行流程的第一步,它会率先发生。

问题2:Segue启动视图时变量的变化与最终值

我先假设你的场景是这样的:你在某个UIViewController子类里声明了一个变量(比如var test: Int = 0),然后有一个Segue的目标是这个ViewController类(也就是通过Segue跳转到该类的新实例)。那触发Segue时的过程和结果是这样的:

  1. 创建新实例:Segue启动时,系统会生成一个该ViewController的全新实例,这个实例的test变量会先被设置为你声明的默认初始值(比如上面的0)。
  2. 可选的赋值操作:如果你在源视图控制器的prepare(for:sender:)方法里,对这个新实例的test变量进行了赋值(比如destVC.test = 20),那test的最终值就是你赋值后的结果。
  3. 无赋值的情况:如果没有在prepare方法里做任何赋值操作,那test就会保持你声明时的默认初始值。

举个具体的代码例子:

class MyVC: UIViewController {
    var test: Int = 0 // 默认初始值
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("当前test的值:\(test)")
    }
}

// 假设这是源VC的代码
class SourceVC: UIViewController {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let targetVC = segue.destination as? MyVC {
            // 如果取消注释下面这行,test最终值就是100;否则是0
            // targetVC.test = 100
        }
    }
}

触发Segue后,运行代码就能看到对应的结果啦。


内容的提问来源于stack exchange,提问作者Luciano Falco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:28:14