模态的定义
功能区别

present只能逐级返回,push所有视图由视图栈控制,可以返回上一级,也可以返回到根vc,其他vc。
present一般用于不同业务界面的切换,push一般用于同一业务不同界面之间的切换

Present

在开发过程中,经常遇到两个视图控制器之间的切换,导航控制器即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];  

tabbar同级之间跳转

在第一个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按钮即可

dismiss和Pop

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];

iOS在push和present混用退回根视图方法(使用通知中心解决)

在多次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];
如此便可以返回到根视图
                    在iOS的界面切换中我们经常使用push和present方法那么这两个有什么区别呢?首先present与dismiss对应push和pop对应。他们的存储也有区别pushViewController 导航控制器入栈的方式切换页面presentViewController 模态切换的方式切换页面模态的定义功能区别present只能逐级返回,push所有视图由视图栈控制,可以返回...
				
IOS之使用纯代码push ViewController LJSettingController *set = [[LJSettingController alloc]init]; [self.navigationController pushViewController:set animated:YES]; 跟用storyboard 连线是一个效果
一、用途和相关概念 iOS中显示ViewController的方式有两种push和modal,modal也叫模态,模态显示VC是iOS的重要特性之一,其主要用于有以下场景: - 收集用户输入信息 - 临时呈现一些内容 - 临时改变工作模式 - 相应设备方向变化(用于针对不同方向分别是想两个ViewController的情况) - 显示一个新的view层级 这些场景都会暂时中断APP的正常执行...
有一个场景: 点击某个按钮,present一个控制器,该控制器有一个透明背景色,然后上面有一个view展现(为方面叙述,称为bgView),点击控制器的view可以使控制器消失,而点击bgView控制器不消失。 这种简单的可以添加两个手势: 在控制器的view上添加手势,点击可以使得控制器消失; 在bgView上添加手势,点击也触发action,但是里面什么都不做。 UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer all
当我们点击区域3时,响应蓝色按钮的点击事件,点击区域1和2时,响应红色按钮的点击事件,对于区域1和3没什么好说的,那如何让红色按钮响应区域2的点击呢?这就是笔者今天要讲的内容。 大家应该都知道,事...
众所周知,iOS显示新的控制器方法通常只有三个:A.push方式; B.modal方式; C.设置为keywindow的根控制器。 而最灵活的貌似是modal方式,几乎可以在随处冒出来。 既然modal一个控制器这么好用,设置完属性让控制器消失也方便,要处理一些比较复杂的业务时,如果你创建一个View,要设置代理等方式添加事件监听,而控制器可以直接处理,那我们最好选择使用modal啦... //推出视图 NextViewController *nextView = [[NextViewController alloc] init]; [self.navigationController pushViewController:nextView animated:YES]; //返回上一级 [self.navigationController popViewCon // push /present Controller 回到根目录 -(void)toRootViewController{ UIViewController * viewController = self.navigationController; while (viewController.presenti...
最近,做项目的时候遇到的,就是present 一个viewController 后,想在这个页面上pushviewcontroller 另一个页面,发现没有任何网页,遍搜所有国内的博客,都没发现有类似的问题,搜stackhack ,发现有类似的问题,经过本人的实验,终于解决了。现把解决方案贴在这里,以便于整理和学习。       遇到这样的问题,貌似需要先把原先的viewcontroller
let storyboard = UIStoryboard(name: "Main", bundle: nil) let viewController = storyboard.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController self.navigationController?.pushViewController(viewController, animated: true) 其中,"MyViewController"是我们要跳转的view的标识符,可以在storyboard中设置。这段代码会将我们的view controller推入导航栏中,实现跳转。