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时的过程和结果是这样的:
- 创建新实例:Segue启动时,系统会生成一个该ViewController的全新实例,这个实例的
test变量会先被设置为你声明的默认初始值(比如上面的0)。 - 可选的赋值操作:如果你在源视图控制器的
prepare(for:sender:)方法里,对这个新实例的test变量进行了赋值(比如destVC.test = 20),那test的最终值就是你赋值后的结果。 - 无赋值的情况:如果没有在
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
相关产品推荐
相关产品推荐

