一、初始化方法
// 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后。
网友评论