首先
present与dismiss对应
push和pop对应。
他们的存储也有区别
pushViewController 导航控制器入栈的方式切换页面
presentViewController 模态切换的方式切换页面
模态的定义
功能区别
present只能逐级返回,push所有视图由视图栈控制,可以返回上一级,也可以返回到根vc,其他vc。
present一般用于不同业务界面的切换,push一般用于同一业务不同界面之间的切换
在开发过程中,经常遇到两个视图控制器之间的切换,导航控制器即UINaVigation是最常用的一种,有时为了某些效果又需要进行模态切换,即present。
如果a->b
a ->present b 之后,你会发现当前页面的navigationController是空的
在进行present之前,重新生成一个导航控制器,然后将下一个视图作为新生成的导航控制器的跟视图,将导航控制器present就行了看代码:
//代码如下
ViewController *VC=[[ViewController alloc]init];
UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:VC];
[self presentViewController:nav animated:YES completion:nil];
在第一个tabBar1的界面中,我们点击了当前页面上的某个控件,让显示第n个tabBar上的内容,相当于从一个tabBar1跳转另一个tabBar(n),其实这个很简单,在当前tabBar1界面控件的事件中加一行代码即可
self.tabBarController.selectedIndex = 2; //(2为要跳转的索引)
隐藏返回键
self.navigationItem.hidesBackButton=YES;
用 UINavigationController 的时候用 pushViewController:animated
返回之前的视图 [[self navigationController] popViewControllerAnimated:YES];
push 以后会在 navigation的 left bar自动添加back按钮,它的响应方法就是返回,所以一般不需要写返回方法,点back按钮即可
pop可以返回很多层,poptoviewcontroller。也可以直接poptoRootViewcontroller
dismiss默认只能一层一层返回。
使用 presentModalViewControllerAnimated方法从 A -> B -> C
若想在 C 中直接返回 A,则可这样实现
C中返回事件 :
- (void)back
{
[self dismissModalViewControllerAnimated:NO]; // 注意一定是NO
[[NSNotificationCenter defaultCenter]postNotificationName:@"backback" object:nil];
}
然后在B中 :
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(back) name:@"backback" object:nil];
-(void)back
{
[self dismissModalViewControllerAnimated:YES];
}
或者
使用两次
[self dismissModalViewControllerAnimated:NO];
[self dismissModalViewControllerAnimated:NO];
ios–多级push或present Controller 直接返回到根目录
// push /present Controller 回到根目录
-(void)toRootViewController{
UIViewController * viewController = self.navigationController;
while (viewController.presentingViewController) {
//是否是最底层控制器
if ([viewController isKindOfClass:[UINavigationController class]]) {
viewController = viewController.presentingViewController;
}else{
break;
}
}
if (viewController) {
[viewController dismissViewControllerAnimated:NO completion:nil];
} }
-(void)navLeftButtonClick:(id)sender{//退出返回到首页
[self toRootViewController];
}
在多次push并且掺杂present后的页面之后,这个时候想要返回到根视图(通常注册过程)
在将要返回的页面中发送通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"popToRootView" object:nil];
[self dismissViewControllerAnimated:YES completion:nil];
然后此时可以在要返回的视图之前的页面注册通知中心, 关联方法里写上返回事件
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(popToRootView) name:@"popToRootView" object:nil];
- (void)popToRootView{
[self.navigationController popViewControllerAnimated:YES];
}
如此便可以返回到根视图