navigationcontroller里push和pop是这么回事?
push操作
我们每次执行下面的代码推出一个新的控制器
[self.navigationController pushViewController:vc animated:YES];
这句话的时候,系统到底干了什么?其实系统是这么做的。
//self相当于navigationController
[self addChildViewController:vc];
vc.view.frame =self.view.frame;
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
navigationcontroller将vc1这个controller添加作为自己的子视图控制器。
设置vc这个视图控制器里根view的frame。
把vc.view添加到navigationcontroller.view上。
用didMoveToParentViewController这个方法通知已经push完毕。
pop操作
每次执行下面的代码返回到上一个控制器
[self.navigationController popViewControllerAnimated:YES]
上面的这句代码同样可以拆分成下面的3步,
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
用willMoveToParentViewController这个方法,并把参数设置为nil,通知vc即将被移除父视图控制器。
把vc.view移除出父视图控制器的view。
然后用removeFromParentViewcontroller这个方法把vc彻底移除当前控制器。
iOS里面的抽屉(path)效果,就是根据这个原理实现的。