使用 UIStoryboard.instantiateViewController 时,何时为 UIViewController 的自定义属性设置值?


  1. 从代码启动UIViewController时,它需要运行的数据会作为init方法中的参数传递,并保存在非可选属性中,因此,当调用ViewDidLoad()时,您可以对数据和视图执行所需的任何操作

  2. 当执行segue时,属性被声明为隐式展开选项(因为故事板需要没有额外参数的init方法来初始化它)。初始化之后,调用loadView()并设置出口。最后,调用prepareForSegue:sender:,其中数据在前面声明的属性中传递和设置,因此,当调用ViewDidLoad()时,您可以对数据和视图执行任何需要的操作

  3. 使用UIStoryboard.instantiateViewController时如何传递数据?据我所知,情节提要会自动调用loadView()viewDidLoad()结尾,而不会让您有机会将数据传递到您声明的自定义属性,因此此时数据还没有准备好使用

(很明显,我可以在调用UIStoryboard.instantiateViewController之后设置属性,但我认为此过程不保证在调用viewDidLoad()之前设置它们)

例如,这(很可能)会起作用:

  1. 呼叫UIStoryboard.instantiateViewController
  2. 在目标UIViewController中设置自定义属性的值
  3. 调用viewDidLoad(),在里面我可以使用数据和视图对象。(因为我在之前为那些属性赋值)

但是想象一下如果:

  1. 呼叫UIStoryboard.instantiateViewController

    。。。我花了一些时间为自定义属性赋予价值
  2. 调用viewDidLoad(),在内部我使用自定义属性。应用程序很可能会崩溃,因为未设置这些属性的值
  3. 在目标UIViewController中设置自定义属性的值(此处已执行viewDidLoad())
无论视图层次结构是否从nib文件加载或在loadView中以编程方式创建方法您通常会覆盖此方法,以便对从nib文件加载的视图执行额外的初始化。

viewDidLoad()确实用于对视图进行额外初始化,因为当您初始化视图控制器(使用-init或-initWithNibName:bundle:)时,它实际上并没有创建和初始化视图。当您第一次调用-view时,它会调用-loadView(我想这就是为什么viewDidLoad()是必要的,用于额外的初始化)。然而,UIViewController本身就是一个类,我认为设置类Object的属性没有任何错误。

我还看了UIStoryboard.instantiateViewController:的定义

使用此方法创建要在应用程序中以编程方式操作和呈现。之前可以使用此方法检索视图控制器,必须在接口中使用适当的标识符字符串显式标记它建设者

此方法创建指定视图控制器的新实例每次你叫它。

我强调new instance,因为它与创建新的viewController不同。通过使用UIStoryboard.instantiateViewController,您在情节提要中创建的所有视图都将自动为您实例化,并且所有出口和操作都将按照您在情节摘要中指定的方式设置。

正如Apple Doc所说的"在你的应用程序中以编程方式操作和呈现",我认为你可以随意这样做

最新更新