iOS 中push和pop到底系统做了些什么事
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的源码里面它做的处理(其实是一个道理)
上面原理部分参考的是彦祖的一篇博客的一部分内容