iOS dismissViewController跳转到RootViewController、跳转到指定ViewController

在开始之前首先要了解的是:
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技术博客的原创作品 ,转载时必须注明出处及相应链接!

你可能感兴趣的:(iOS dismissViewController跳转到RootViewController、跳转到指定ViewController)