iosiOS 开发每天分享优质文章iOS Developer

iOS push和present区别以及混用

2016-12-26  本文已影响3613人  SunshineBrother

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

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

平时我们可能会有这样的需求,在第一个tabBar1的界面中,我们点击了当前页面上的某个控件,让显示第n个tabBar上的内容,相当于从一个tabBar1跳转另一个tabBar(n),其实这个很简单,在当前tabBar1界面控件的事件中加一行代码即可

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

猜你喜欢

热点阅读