0
点赞
收藏
分享

微信扫一扫

iOS push和present区别以及混用

在开发过程中,经常遇到两个视图控制器之间的切换,导航控制器即UINaVigation是最常用的一种,有时为了某些效果又需要进行模态切换,即present。
我们的布局经常是在window上加一个nav,然后以viewControl作为nav的根视图进行导航。如果在导航之间有了一个present之后,你会发现当前页面的navigationController是空的,也就是说导航控制器不管用了。下面我就介绍几种解决方法

方法一

在进行present之前,重新生成一个导航控制器,然后将下一个视图作为新生成的导航控制器的跟视图,将导航控制器present就行了看代码:

ViewController *VC=[[ViewController alloc]init];  
UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:VC];  
[self presentViewController:nav animated:YES completion:nil];  

这样的话问题基本解决了,但就是没有回到最初的跟视图,只能在当前的导航控制器之间切换

方法二

获取当前的window实例,在得到widow的跟视图,即为导航器,然后根据导航器的索引就可以找到当前的视图啦

// 先取消原来的控制器
  [self dismissViewControllerAnimated:NO completion:nil];
  ViewController *VC=[[ViewController alloc]init];  
  UIWindow *window=[[UIApplication sharedApplication]keyWindow];  
  UINavigationController *nav0=(UINavigationController *)window.rootViewController;  
  UIViewController *viewController=[nav0.viewControllers objectAtIndex:1];  
  [viewController.navigationController pushViewController:VC animated:YES];  

判断当前viewcontroller是push还是present的方式显示的

NSArray *viewcontrollers=self.navigationController.viewControllers;
if (viewcontrollers.count>1) {
    if ([viewcontrollers objectAtIndex:viewcontrollers.count-1]==self) {
        //push方式
        [self.navigationController popViewControllerAnimated:YES];
    }
}
else{
    //present方式
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}

通过presentviewcontroller的方式显示的viewcontroller不会存入self.navigationController.viewControllers数组中。而通过push方式显示的viewcontroller会存在该数组的最后。

tabbar同级之间跳转

方法一
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    TarbarViewController *tab = (TarbarViewController *)delegate.window.rootViewController;
    tab.selectedIndex = 1;

方法2
self.tabBarController.selectedIndex = 2; //(2为要跳转的索引)  
隐藏返回键
self.navigationItem.hidesBackButton=YES;
使用这句代码就可以隐藏了。
举报

相关推荐

0 条评论