一.push和present的相同点:

pushpresent方法都可用于推出新的界面。

  • pushpop对应使用。
//推出视图
	NextViewController *nextView = [[NextViewController alloc] init];
    [self.navigationController pushViewController:nextView animated:YES];

//返回上一级
[self.navigationController popViewControllerAnimated:YES];

//返回根视图
[self.navigationController popToRootViewControllerAnimated:YES];

//返回指定级数
//objectAtIndex:参数为想要返回的级数
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0]  animated:YES];
  • presentdismiss对应使用。
//推出视图
	NextViewController *nextView = [[NextViewController alloc] init];
 
    [self presentViewController:nextView animated:YES completion:nil];

//返回上一个视图(只能逐级返回)
[self dismissViewControllerAnimated:NO completion:nil];

二.push和present的不同点:

push:

push由视图栈控制,每一个视图都入栈,调用之前的视图则需要出栈,可返回任意一层,一般用于同一业务不同界面之间的切换。
push是由UINavigationController管理的视图控制器堆栈,在window下同时只能显示一个ViewController。

present:

present弹出的视图是模态视图(我对模态视图的理解大概就是一个临时视图),只能逐级返回,一般用于不同业务界面的切换。
present是由UIViewController管理的视图控制器堆栈,在window下可以以叠加的方式展示,当顶层的view透明时可以看到底层的view,但只有顶层的view可用户交互。

三.在实际开发中经常会遇到的需求:

A页面(首页)
B页面(详情页)
C页面(编辑页)

1.全push交互:

UITabBarController下由每个子UINavigationControllerpush所有的A、B、C页面。在特定场景下如QQ,从其他的任何子ViewController跳转到聊天页面,都需要将当期的UINavigationController popRoot,再UITabBarController 跳转到第一个UINavigationController,然后再由当期的UINavigationController push至会话页面。

2.全present交互:

如今日头条,使用的就是全present交互,一致的present动画。这样的交互优势是简单,可以适应所有的跳转交互需求(本地交互与远程交互),缺点是用户交互方式单一,当遇到像QQ一样的单一聊天页面需求时,很难实现。

3.主push辅present交互:

主要由push交互,当遇到无其他跳转的页面时可以用present来跳转,例如编辑页面、登录页面。

四.代码演示:

push:

ios 返回上两级 ios设置返回上一级_用户交互

ios 返回上两级 ios设置返回上一级_ios_02

ios 返回上两级 ios设置返回上一级_模态视图_03

present:

在第一个视图点击屏幕出现第二个视图,在第二个视图点击屏幕返回第一个视图。

ios 返回上两级 ios设置返回上一级_ios_04


ios 返回上两级 ios设置返回上一级_用户交互_05


push代码地址:push present代码地址:present