天天看点

iOS 一键返回App首页功能

从App的rootViewController开始,找到所有presentedController,然后逆序dismiss这些Controller,最后pop to rootViewController就可以了。

参考这个思路可以做一些其他非常规页面跳转。

- (void)backToHomePage
{
    UIWindow *window = [(AppDelegate *)[UIApplication sharedApplication].delegate window];
    UIViewController *presentedController = nil;
    
    UIViewController *rootController = [window rootViewController];
    if ([rootController isKindOfClass:[UITabBarController class]]) {
        rootController = [(UITabBarController *)rootController selectedViewController];
    }
    presentedController = rootController;
    //找到所有presented的controller,包括UIViewController和UINavigationController
    NSMutableArray<UIViewController *> *presentedControllerArray = [[NSMutableArray alloc] init];
    while (presentedController.presentedViewController) {
        [presentedControllerArray addObject:presentedController.presentedViewController];
        presentedController = presentedController.presentedViewController;
    }
    if (presentedControllerArray.count > 0) {
        //把所有presented的controller都dismiss掉
        [self dismissControllers:presentedControllerArray topIndex:presentedControllerArray.count - 1 completion:^{
            [self popToRootViewControllerFrom:rootController];
        }];
    } else {
        [self popToRootViewControllerFrom:rootController];
    }
}
           
- (void)dismissControllers:(NSArray<UIViewController *> *)presentedControllerArray topIndex:(NSInteger)index completion:(void(^)(void))completion
{
    if (index < 0) {
        completion();
    } else {
        [presentedControllerArray[index] dismissViewControllerAnimated:NO completion:^{
            [self dismissControllers:presentedControllerArray topIndex:index - 1 completion:completion];
        }];
    }
}
           
- (void)popToRootViewControllerFrom:(UIViewController *)fromViewController
{
    //pop to root
    if ([fromViewController isKindOfClass:[UINavigationController class]]) {
        [(UINavigationController *)fromViewController popToRootViewControllerAnimated:YES];
    }
    if (fromViewController.navigationController) {
        [fromViewController.navigationController popToRootViewControllerAnimated:YES];
    }
}