【问题标题】:In iOS, does a segue instantiate the new-to-be-used view controller? Or is it already instantiated?在 iOS 中,segue 是否会实例化新使用的视图控制器?还是已经实例化了?
【发布时间】:2017-04-27 23:22:48
【问题描述】:

例如,假设我有一个 UIViewController 的常规子类,并且我已将此控制器视图中包含的控制对象连接到一个 segue 操作,该操作将使另一个视图控制器的视图进入视图...

足够简单。

当我在常规子类 UIViewController 上调用名为 prepare(for:sender:) 的方法时,此时,我关心要使用的新视图控制器,其视图将在屏幕上弹出。这是新的吗?视图控制器已经在某处实例化了?

我相信答案是肯定的,因为在 prepare(for:sender:) 函数中,我为 segue.destination(它是目标视图控制器)设置了一个引用,当我打印该引用时,它似乎是一个地方在内存中已经告诉我新的视图控制器已经实例化了。

任何人都可以确认/否认这个新的视图控制器(从情节提要创建)已经被实例化,或者用更简单的术语来说明?

谢谢

【问题讨论】:

  • 这很容易知道。覆盖视图控制器的 init 方法并记录何时以及如何创建新实例。
  • 在我的测试中,每次在拆分视图控制器中转到详细视图控制器时都会创建一个新实例

标签: ios storyboard segue


【解决方案1】:

Apple 的文档说,

当情节提要运行时检测到自定义转场时,它会创建您的类的新实例,使用视图控制器对象对其进行配置,要求视图控制器源为转场做准备,然后执行转场。

(https://developer.apple.com/reference/uikit/uistoryboardsegue)

所以目标 UIViewController 在发送 prepareForSegue 到源 UIViewController 之前由 segue 实例化。

所以要直接回答你的问题,这两个问题都是“是”:

在 iOS 中,segue 是否会实例化新使用的视图控制器?

是的,segue 确实实例化了目标视图控制器。

还是已经实例化了?

是的,当您的 prepareForSegue 被调用时,它已经被实例化了 - 就在之前。

更新:正如@Jeffery_Thomas 评论的那样,通过在目标视图控制器的init 中添加NSLog() 行很容易证明这一点。

【讨论】:

    【解决方案2】:

    任何人都可以确认/否认这个新的视图控制器(从故事板创建)已经被实例化,

    是的。这就是触发转场的含义。触发 segue 的工作是实例化目标视图控制器,prepare 存在以便您可以配置该实例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多