viewWillAppear调用原理:实际上是该控制器中的view被加入window中显示才会调用viewWillAppear
ios中一个应用程序只有一个主Window,我们一般看到的窗口控制器显示的内容是window中最上面一层view.
ios中用来显示控制器弹出的使用的有2中弹出方式pushViewController,presentViewController.
pushViewController一般是以导航控制器的方式弹出,导航控制器中的控制器是以栈的方式加入到导航控制器. 函数push(入栈) pop(出栈) . 当将一个控制器加入到导航控制器时,新加入的控制器都是在栈的最上面,当新控制器加入导航控制器后,会将当前最上层的控制器的view添加到window中,在添加到window中前,会将上一个window中view从window中移除.所以pushViewController显示出来时候,当前window中都只有当前栈对顶层控制器的view. 执行pop后,将当前控制器从栈中移除,将当前window中的view移除,将栈中下一个控制器的view重新加入到window中.所以viewWillAppear会被重新调用
presentViewController也是控制器以模态方式弹出,presentViewController控制器的弹出跟其他都没有关系,而是将控制器的view添加到window中,不会移除window中原有的view.当控制器退出时,显示下一个控制器不会调用viewWillAppear. 因为下一个控制器的view并没有被重新添加到window,只是被新的view盖住了而已.
总结:pushViewController出的控制器pop后,下一个控制器会执行viewWillAppear
presentViewController出的控制器dissmiss后,下一个控制器不会执行viewWillAppear