iOS 获取当前手机所在页面控制器,返回指定页面

97 篇文章 0 订阅
79 篇文章 2 订阅

在开发过程中有时候我们会使用到获取当前所在页面的控制器

那我们如何获取当前控制器呢


-(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: 返回指定页面,但是我们不清楚返回的是哪一页,但是我们知道,应该返回几页就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王 哪跑!!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值