在开发过程中有时候我们会使用到获取当前所在页面的控制器
那我们如何获取当前控制器呢
-(UIViewController *)topViewController{
UIViewController *controller = [self topViewControllerWithRootViewController:[self getCurrentWindow].rootViewController];
return controller;
}
- (UIViewController *)topViewControllerWithRootViewController:(UIViewController *)viewController{
if (viewController==nil) return nil;
if (viewController.presentedViewController!=nil) {
return [self topViewControllerWithRootViewController:viewController.presentedViewController];
}else if([viewController isKindOfClass:[UITabBarController class]]){
return [self topViewControllerWithRootViewController:[(UITabBarController *)viewController selectedViewController]];
}else if ([viewController isKindOfClass:[UINavigationController class]]){
return [self topViewControllerWithRootViewController:[(UINavigationController *)viewController visibleViewController]];
}else{
return viewController;
}
}
- (UIWindow *)getCurrentWindow{
UIWindow *window = [UIApplication sharedApplication].keyWindow;
if (window.windowLevel!=UIWindowLevelNormal) {
for (UIWindow *wid in [UIApplication sharedApplication].windows) {
if (window.windowLevel==UIWindowLevelNormal) {
window = wid;
break;
}
}
}
return window;
}
到此,就实现了获取当前所在页面控制器
应用场景内,我现在写的项目是推送,类似于今日头条、网易新闻等,来个推送点击进入对应的页面。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
//关闭友盟对话框
[UMessage setAutoAlert:NO];
[UMessage didReceiveRemoteNotification:userInfo];
NSLog(@"_______________友盟系统方法 userInfo %@",userInfo);
UIViewController *viewController = [self topViewController];
NSLog(@"viewController - - - - - %@",viewController);
//此处可以携带参数等
[viewController.navigationController pushViewController:[[CommunityConstrutionVC alloc]init] animated:YES];
}
接下来就是实现点击返回指定页面
第一个,返回指定页面
[self.navigationController popToViewController:[[AuthenticationCodeVCalloc]init]animated:YES];
还有一种,
UINavigationController *navVC =self.navigationController;
NSMutableArray *viewControllers = [[NSMutableArrayalloc]init];
for (UIViewController *vc in [navVCviewControllers]) {
[viewControllers addObject:vc];
if ([vc isKindOfClass:[RepairFourSVC class]]) {
break;
}
}
[navVC setViewControllers:viewControllers animated:YES];
第二个,返回到跟试图
[self.navigationController popToRootViewControllerAnimated:YES];
应用场景,
返回首页
第三个,一次性pop出几个页面
int index = (int)[[self.navigationController viewControllers]indexOfObject:self];
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:(index -2)] animated:YES];
index-2不要随便写,作完的差值,不能不在self.navigationController.viewControllers这个数组的范围外,否则会出现数组越界,导致程序闪退。
应用场景,
当我们点击登录,我们push到登录,获取验证码以后,再跳到下一个页面输入验证码,登录成功后我们要返回到,未登录之前的页面,我们用pop只能返回的上一页,我么用 popToViewController: 返回指定页面,但是我们不清楚返回的是哪一页,但是我们知道,应该返回几页就可以了。