当前位置: 首页 > 工具软件 > Jot-iOS > 使用案例 >

iOS pushViewController 和 presentViewController

微生高谊
2023-12-01

在iOS的界面切换中我们经常使用push和present方法那么这两个有什么区别呢?

首先
present与dismiss对应
push和pop对应。

他们的存储也有区别
pushViewController 导航控制器入栈的方式切换页面
presentViewController 模态切换的方式切换页面

模态的定义
功能区别

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;

Back

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

 
如此便可以返回到根视图
 类似资料: