控制器的初始化

2019-03-14  本文已影响0人  Leon1024

一、初始化方法

    // 1.代码初始化
    ViewController *VCA = [[ViewController alloc] init];
    // 2.代码初始化,根据xib名字,从xib加载创建
    ViewController *VCB = [[ViewController alloc] initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
    // 3.代码初始化,根据标识符字符串,从UIStoryboard加载创建
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    ViewController *VCC = [storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"];
    // 4.直接从 UIStoryboard 中拉线跳转,UIStoryboard进行自动管理

以上四种方法初始化控制器时。
第一种: init 方法默认会调用 initWithNibName: bundle: 方法。
第二种:initWithNibName: bundle: 只调用自己,不调用 init。
第三、四种: 故事版初始化方法,只调用控制器的 initWithCoder: 方法。

另外:

如果故事板中的控制器,它里面的某个子view,在其它地方被初始化时,会将这个控制器初始化一次。

二、控制器中的View

控制器自身的的view在控制器初始化的时候,是不存在的。它会在控制器的生命周期到了- (void)loadView 的时候才创建。故事板或xib中都没有对应的view时,会自动创建一个空view作为自身的view。
需要注意的是:如果需要在 - (void)loadView 方法中重写自定义view,不能调用 [super loadView] 父类方法。

三、生命周期

1、 - (void)loadView

加载自身的view。但子视图还未被加载。

2、- (void)viewDidLoad

加载好自身的view,自身的frame已确定,并且子视图也已经被初始化了,但还未进行子视图的布局,所以子视图的frame还未按约束进行布局计算。不要在这里获取子视图的frame数值。

3、 - (void)viewWillAppear:

视图将要显示,此方法会在控制器被切换或其它原因由消失到显示时调用。常用于配置导航栏等,或需要显示就刷新的方法。此时还未布局子视图。

4、 - (void)viewWillLayoutSubviews

将要对子视图进行布局,会调用多次。这里可以对将要进行的布局,进行计算和设置。但不要获取子视图的frame,还没布局好。

5、- (void)viewDidLayoutSubviews

子视图已经根据约束等布局完毕,可以获取按用户设定的正确的子视图参数。会多次调用。这里可以根据需要,随时调整子视图的关系。

6、- (void)viewDidAppear:

此时已经布局好,显示到手机屏幕上了。此方法内、后的操作,会被用户看到视图变化。

7、- (void)viewWillDisappear:

控制器将要消失,但还未消失。

8、- (void)viewDidDisappear:

视图已消失。

9、- (void)dealloc

控制器销毁。别在这里做太多涉及到此控制器的事情。

控制器专场时,命令pop出后,第一步会先异步执行- (void)viewWillDisappear:。接下来会调用上层控制器的- (void)viewWillAppear:。 再调用自身的 - (void)viewDidDisappear:。再上层控制器的- (void)viewDidAppear:。最后自身的- (void)dealloc销毁。都是异步主线程执行。

四、其它注意

当控制器刚被初始化时,在还未触发viewDidLoad时,其子控件还不存在。不要对它的子控件进行操作。操作应该在viewDidLoad后。

上一篇下一篇

猜你喜欢

热点阅读