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()
已经执行)
答案 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所说“在您的应用程序中以编程方式操作和呈现”,我认为您可以随意这样做。