在开始之前首先要了解的是:
presentViewController
、dismissViewController
进行视图控制器跳转属于模式跳转,这些视图控制器是通过一个栈来维护的。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技术博客的原创作品 ,转载时必须注明出处及相应链接!