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

时间:2016-05-25 11:41:12

标签: swift storyboard uistoryboard

1-从代码启动UIViewController时,需要运行的数据在init方法中作为参数传递并保存在非可选属性中,所以当调用ViewDidLoad()时,你可以做任何事情需要数据和视图。

2-执行segue时,属性被声明为隐式解包选项(因为storyboard需要init方法而没有额外的参数才能启动它)。初始化loadView()后,调用并设置出口。最后,调用prepareForSegue:sender:,其中数据在先前声明的属性中传递和设置,因此,当调用ViewDidLoad()时,您可以使用数据和视图执行任何操作。

3-使用UIStoryboard.instantiateViewController时如何传递数据?据我了解,storyboard会自动调用loadView()viewDidLoad()结尾,而不会让您有机会将数据传递给您声明的自定义属性,因此此时数据无法使用。< / strong>

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

有什么想法吗?谢谢!

编辑1
例如,这(很可能)将起作用:
1 - 致电UIStoryboard.instantiateViewController
2 - 在目标UIViewController中设置自定义属性的值 3 - viewDidLoad()被调用,在里面我可以使用数据和视图对象。(因为我在
之前为那些属性赋予了价值)

但想象一下:
1 - 致电UIStoryboard.instantiateViewController
...
...我花了一些时间为自定义属性赋予价值...
...
2 - 调用viewDidLoad(),在里面我使用自定义属性。该应用程序很可能会崩溃,因为未设置这些属性的值 3 - 在目标UIViewController中设置自定义属性的值(此处viewDidLoad()已经执行)

1 个答案:

答案 0 :(得分:0)

  无论视图层次结构是否为,都会调用

viewDidLoad()   从nib文件加载或在loadView中以编程方式创建   方法.............您通常会覆盖此方法,以便对从nib文件加载的视图执行其他初始化。

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

我还看了UIStoryboard.instantiateViewController的定义:

  

您可以使用此方法创建所需的视图控制器对象   在您的应用程序中以编程方式操作和呈现。之前   您必须使用此方法来检索视图控制器   在Interface中使用适当的标识符字符串显式标记它   助洗剂。

     

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

我强调new instance,因为它与创建新的viewController不同。通过使用UIStoryboard.instantiateViewController,您在故事板中创建的所有视图都将自动为您实例化,并且所有插座和操作都将按照您在故事板中的指定进行设置。

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