开发中遇到的几种ViewController间的跳转,谨记视图控制器按照后进先出的堆栈方式叠加上去的
注意present和dismiss;push 和 pop 一般是成对存在的,底层VCdismiss或pop后上层的也会释放掉的
其中A,B,C均指普通的ViewController
案例一:(例如登录退出)
A-presentViewController->B-presentViewController->C
如何从 C dismissViewController 到 A 呢?如下:
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
看看官方文档就知道
// The view controller that was presented by this view controller or its nearest ancestor.
@property(nonatomic,readonly) UIViewController *presentedViewController NS_AVAILABLE_IOS(5_0);
// The view controller that presented this view controller (or its farthest ancestor.)
@property(nonatomic,readonly) UIViewController *presentingViewController NS_AVAILABLE_IOS(5_0);
打印一下发现
C 的presentingViewController = <BViewController: 0x1556023b0>
及presentingViewController.presentingViewController = <AViewController: 0x155607a30>
试了一下
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
发现无法达到预期效果,估计应该要从最底层的释放方可
案例二:底层是NavigationController
naviA - push -> B -puch-> C-pusn-> D -push->E
这里我想从 E pop到任意一个VC该怎么办呢,先获取NavigationController上所有的VC,遍历到自己想要跳转的,跳过去就行,方法如下:
案例三:底层是NSTabBarViewController+ 多个NSNavigationController
需求是像微信那样不管是从朋友圈进去一直push到聊天界面还是从消息界面push到聊天界面,然后从聊天界面直接pop出来后总是显示在第一个tab的消息界面
做法是:在退出按钮按下时先设置tabBarViewController的selectItem=0,再popToRootViewController
注意present和dismiss;push 和 pop 一般是成对存在的,底层VCdismiss或pop后上层的也会释放掉的
其中A,B,C均指普通的ViewController
案例一:(例如登录退出)
A-presentViewController->B-presentViewController->C
如何从 C dismissViewController 到 A 呢?如下:
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
看看官方文档就知道
// The view controller that was presented by this view controller or its nearest ancestor.
@property(nonatomic,readonly) UIViewController *presentedViewController NS_AVAILABLE_IOS(5_0);
// The view controller that presented this view controller (or its farthest ancestor.)
@property(nonatomic,readonly) UIViewController *presentingViewController NS_AVAILABLE_IOS(5_0);
打印一下发现
C 的presentingViewController = <BViewController: 0x1556023b0>
及presentingViewController.presentingViewController = <AViewController: 0x155607a30>
试了一下
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
发现无法达到预期效果,估计应该要从最底层的释放方可
案例二:底层是NavigationController
naviA - push -> B -puch-> C-pusn-> D -push->E
这里我想从 E pop到任意一个VC该怎么办呢,先获取NavigationController上所有的VC,遍历到自己想要跳转的,跳过去就行,方法如下:
NSArray *vcS=[self.navigationController viewControllers];
[vcS enumerateObjectsUsingBlock:^(YourViewController* obj, NSUInteger idx, BOOL *stop) {
if([obj isKindOfClass:[YourViewController class]]){
YourViewController* bin=(YourViewController*)obj;
[self.navigationController popToViewController:bin animated:YES];
*stop=YES;
}
}];
案例三:底层是NSTabBarViewController+ 多个NSNavigationController
需求是像微信那样不管是从朋友圈进去一直push到聊天界面还是从消息界面push到聊天界面,然后从聊天界面直接pop出来后总是显示在第一个tab的消息界面
做法是:在退出按钮按下时先设置tabBarViewController的selectItem=0,再popToRootViewController