美文网首页iOSiOS、swift技术交流!iOS扩展
iOS dismissViewController跳转到Root

iOS dismissViewController跳转到Root

作者: JerryLMJ | 来源:发表于2016-09-08 21:24 被阅读3346次

    在开始之前首先要了解的是:
    presentViewControllerdismissViewController进行视图控制器跳转属于模式跳转,这些视图控制器是通过一个栈来维护的。present会使ViewController进栈,dismiss会使ViewController出栈。

    但是模式跳转这种方式不像通过NavigationController进行跳转那样,我们可以很容易拿到navigationController栈中的viewControllers数组。

    所以,我们要通过另外一种方式来获得模式跳转中栈所存储的viewControllers

    先来介绍UIViewContrller中的一个属性

    // The view controller that presented this view controller (or its farthest ancestor.)
    @property(nullable, nonatomic,readonly) UIViewController *presentingViewController NS_AVAILABLE_IOS(5_0);
    

    通过注释可以了解到这个属性表示:推出这个视图控制器的视图控制器,也就是当前视图控制器的上一级视图控制器。

    那么有了这个属性我们就可以通过当前的视图控制器一步一步向上一级视图追溯了,就好像一个链表,因此我们可以获得栈中的每一个视图控制器。

    如何跳转到根视图控制器

    UIViewController * presentingViewController = self.presentingViewController;
    while (presentingViewController.presentingViewController) {
        presentingViewController = presentingViewController.presentingViewController;
    }
    [presentingViewController dismissViewControllerAnimated:YES completion:nil];
    

    上面代码中的while的作用就是通过循环找出根视图控制器的所在

    如何跳转到指定视图控制器

    跳转到指定的视图控制器是根据视图控制器的类名进行判断,在栈中找到相对应得视图控制器进行跳转

    UIViewController * presentingViewController = self.presentingViewController;
    do {
        if ([presentingViewController isKindOfClass:[类名 class]]) {
            break;
        }
        presentingViewController = presentingViewController.presentingViewController;
        
    } while (presentingViewController.presentingViewController);
    
    [presentingViewController dismissViewControllerAnimated:YES completion:nil];
    

    再介绍一下跟presentingViewController相关的两个属性

    • presentedViewController是指该试图控制器推出的下一级视图控制器
    // The view controller that was presented by this view controller or its nearest ancestor.
    @property(nullable, nonatomic,readonly) UIViewController *presentedViewController  NS_AVAILABLE_IOS(5_0);
    
    • 还有一个parentViewController属性,其实在iOS5.0之前我们是通过这个属性进行上一级视图控制器的寻找的,但是在iOS5.0以后新添加了presentingViewController属性,同时parentViewController属性在iOS5.0以后当采用模式跳转的时候返回的都是nil
    /*
      If this view controller is a child of a containing view controller (e.g. a navigation controller or tab bar
      controller,) this is the containing view controller.  Note that as of 5.0 this no longer will return the
      presenting view controller.
    */
    @property(nullable,nonatomic,weak,readonly) UIViewController *parentViewController;
    

    版权声明:出自MajorLMJ技术博客的原创作品 ,转载时必须注明出处及相应链接!

    相关文章

      网友评论

      • 丸子_f396:您好,我用这个方法跳转到根控制器的时候,发现可以看到每个控制器都闪了一下,才跳回到根控制器,请问有没有办法解决这一现象。
      • PGOne爱吃饺子:楼主,你好,有个问题想麻烦你一下
      • liyaoyao:楼主,我按照你这个写的没有作用,请问你怎么回事
        丸子_f396:你可以打个断点看一下presentingviewcontroller是不是nil,如果是nil的话,当然不会跳转了

      本文标题:iOS dismissViewController跳转到Root

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