iOS中的push和pop是一個很常用的視圖切換方法,他們是成對出現的,
簡而言之,push就是壓棧,pop就是出棧!
[self.navigationController pushViewController:VC animated:YES];
那么蘋果為實現這一句話具體做了些什么事呢?
[self addChildViewController:VC]; // 1
VC.view.frame = [self frameForContentController]; // 2
[self.view addSubview:VC.view]; // 3
[VC didMoveToParentViewController:self]; // 4
- 第一步,NavigationController用addChildViewController這個函數把VC這個controller添加作為自己的子視圖控制器。
- 第二步,設置VC這個controller里的根view的frame。
- 第三步,把VC.view添加到Navigationcontroller.view上。
- 第四步,用didMoveToParentViewController這個方法通知已經push完畢。
既然有push,那么就會有pop
[self.navigationController popViewControllerAnimated:YES];
蘋果做的事:
[VC willMoveToParentViewController:nil]; // 1
[VC.view removeFromSuperview]; // 2
[VC removeFromParentViewController]; // 3
- 第一步,用willMoveToParentViewController這個方法,並把參數設置為nil,通知VC這個Controller即將被移除父視圖控制器。
- 第二步,把VC.view移除出父視圖控制器的view。
- 第三步,然后用removeFromParentViewcontroller這個方法把VC徹底移除。
下面貼出RESideMenu的源碼里面它做的處理(其實是一個道理)
上面原理部分參考的是彥祖的一篇博客的一部分內容