viewWillAppear調(diào)用原理:實(shí)際上是該控制器中的view被加入window中顯示才會調(diào)用viewWillAppear
ios中一個應(yīng)用程序只有一個主Window,我們一般看到的窗口控制器顯示的內(nèi)容是window中最上面一層view.
ios中用來顯示控制器彈出的使用的有2中彈出方式pushViewController,presentViewController.
pushViewController一般是以導(dǎo)航控制器的方式彈出,導(dǎo)航控制器中的控制器是以棧的方式加入到導(dǎo)航控制器. 函數(shù)push(入棧) pop(出棧) . 當(dāng)將一個控制器加入到導(dǎo)航控制器時,新加入的控制器都是在棧的最上面,當(dāng)新控制器加入導(dǎo)航控制器后,會將當(dāng)前最上層的控制器的view添加到window中,在添加到window中前,會將上一個window中view從window中移除.所以pushViewController顯示出來時候,當(dāng)前window中都只有當(dāng)前棧對頂層控制器的view. 執(zhí)行pop后,將當(dāng)前控制器從棧中移除,將當(dāng)前window中的view移除,將棧中下一個控制器的view重新加入到window中.所以viewWillAppear會被重新調(diào)用
presentViewController也是控制器以模態(tài)方式彈出,presentViewController控制器的彈出跟其他都沒有關(guān)系,而是將控制器的view添加到window中,不會移除window中原有的view.當(dāng)控制器退出時,顯示下一個控制器不會調(diào)用viewWillAppear. 因?yàn)橄乱粋€控制器的view并沒有被重新添加到window,只是被新的view蓋住了而已.
總結(jié):pushViewController出的控制器pop后,下一個控制器會執(zhí)行viewWillAppear
presentViewController出的控制器dissmiss后,下一個控制器不會執(zhí)行viewWillAppear