0、简介
UITabBarController 是一个很常用的控件, 在一般情况下一个APP中只会用到一次。实际开发中, 不会直接使用 UITabBarController, 而是写一个子类。
1、是什么
答案很简单: 是一个控制器。继承于 UIViewController 的子类控制器。父类主要的区别在于、添加的子控制器能自动的从左到右的排列起来(说法有点不专业, 但是现象就是这样)。
2、生命周期
其生命周期与父类没有多大区别。暂时我所发现的区别, 就是今天的主题:viewDidLoad实例方法执行的时机有所不同。
都知道 UIViewController 的 viewDidLoad实例方法的执行时机是 self.view 第一次被渲染的时候。什么意思呢?先来看看下面的两种场景:
场景1、想要从当前控制器push到另一个控制器中。通常code如下:
// 创建控制器
HGController* hgVC = [[HGController alloc] init];
// TODO:通常在这里会有赋值处理
// Push
[self.navigationController pushViewController:hgVC animated:YES];
那么问题来了:HGController中的viewDidLoad实例方法在什么时候会被调用呢?答案就是执行了Push之后, 就会被调用,其实解释也很简单,Push之后这个控制器的view就出来了。
场景2、只能会在Push之后才能执行viewDidLoad实例方法么?答案是否定的,请看如下code:
// 创建控制器
HGController* hgVC = [[HGController alloc] init];
// TODO:通常在这里会有赋值处理
// 给 hgVC 的 view 设置背景色 (开发中不会这么智障,这里只是说明问题而已)
hgVC.view.backgroundColor = [UIColor redColor];
// Push
[self.navigationController pushViewController:hgVC animated:YES];
如果是上面的代码, 你会发现 执行了 给 hgVC 的 view 设置背景色 之后,viewDidLoad实例方法就已经执行了。
上面的两个场景,应该就能回答这个面试题了:在 UIViewController中的 viewDidLoad实例方法在什么时候会被执行?这个面试题能难倒三年工作经验的人, 你信么?
答案就是上面的两个场景中、 但是还没有完,如果你再把下面的场景(今天的主题)回答了, 那就完美了。
3、特别之处
这里的特别之处就是今天所要分享的主题,UITabBarController 是有所不同的。
现在创建一个空的控制器 HGTabBarController, 继承于UITabBarController。你只需要在 viewDidLoad 中写上这么一句:
NSLog(@"viewDidLoad = %@", self);
然后你找一个方便的控制器写上这么一句:
[[HGTabBarController alloc] init];
对、 你没有看错,就这么一句就足够了。你运行一下,就有打印了:
2017-07-09 18:54:05.295 HGDismManager[50411:2331505] viewDidLoad = <HGTabBarController: 0x7fedb0908eb0>
说明就上面的一句,HGTabBarController中的 viewDidLoad 被调用了。这个实验也说明了一个问题:UITabBarController在 init 方法中就已经对view有操作了。
4、总结
总结什么呢?说了这么一堆,我感觉也没有必要说这么一堆。因为总结就这么一句:UITabBarController 中的 viewDidLoad 方法会被提前调用。所以大家以后要多注意。
以后就不要将外面传进来的值放在 viewDidLoad 方法中使用了。因为为空, 除非做特殊处理。
谢谢~