iOS push和present区别以及混用

作者: SunshineBrother | 来源:发表于2016-12-26 10:22 被阅读3613次

    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;
    使用这句代码就可以隐藏了。
    

    相关文章

      网友评论

      本文标题:iOS push和present区别以及混用

      本文链接:https://www.haomeiwen.com/subject/pkhjvttx.html