viewWillAppear和viewDidAppear什么时候被调用

viewWillAppear和viewDidAppear什么时候被调用

问:

当我向一个UINavigationController压入一个视图控制器的时候,

1.    什么时候会触发viewWillAppear和viewDidAppear?

2.    什么导致了触发viewWillAppear和viewDidAppear失败?

答:

当你调用pushViewController:animated把一个视图控制器压入UINavigationController的时候,UINavigationController会自动调用这些方法。相似的,当你tabs时,UITabBarController会直接调用这些方法,当你使用presentModalViewController时也会调用方法。当一个视图控制器的视图被添加到一个window中时也会调用这些方法。我在这些情况下没有遇到过这些方法调用失败的情况。

记住,这些方法只在这些特定的情况下控制器pushed或presented的时候被调用。在其它的情况下不会被调用,比如你添加你的视图控制器的视图作为一个视图的子视图而不是作为window的子视图。苹果官方文档说视图控制器仅用于全屏显示的视图,典型的是使用上面提到的方法。可以忽略苹果的建议使一个视图控制器关联另一个视图控制的的视图作为子视图,但是你需要在作为容器的视图控制器中手动的调用嵌套控制器的viewWillAppear和viewDidAppear。



在 iOS 5.0 以前,视图控制器容器只属于苹果系统所有,苹果不建议你自定义视图控制器容器。实际上,在视图控制器编程指南这一章中明确告知我们不要使用它。以前苹果公司对于视图控制器容器的总体描述是“一个管理整个屏幕内容的视图控制器”,而现在的描述是“一个包含本身视图内容的单元集合”。为什么苹果不希望我们自定义像tab bar controllers 和navigation controllers这样的视图控制器容器呢?更准确的说,下面这条语句会带来什么问题:

[viewControllerA.view addsubView:viewControllerB.view]

view-insertion@2x

UIWindow作为应用程序的根视图,负责监听和分发屏幕旋转和视图布局等消息。在上图中,ViewController的view插入到根视图控制器当中的一个视图中作为其子视图,那么这个view就不会再接收到UIWindow传来的消息,像viewWillAppear:这种方法就不会被调用。

在ios5.0以前我们自定义的视图控制器容器,将会持有子类视图控制器的一个引用,并且需要我们手动的传递在父类视图控制器中调用的事件消息给子类视图控制器,准确地完成这项工作太难了!

猜你喜欢

转载自blog.csdn.net/GuodongSun0/article/details/46792877
今日推荐