推送跳转到N级界面 返回那些事

有没有开发的童鞋和我一样遇到过这样的需求:
正常进入APP时跳转逻辑是这样的
A push to ----> B push to ----> C
C pop to ----> B pop to ----> A 或者 C pop to ----> A

推送跳转到N级界面 返回那些事_第1张图片
123.gif

推送点击跳转产品要求是这样的
场景N.01 ==> 假如APP 退到后台是在A界面(以A界面为rootVC)点击推送直接跳转到C界面,然后C点击返回返回到B界面,B再返回A界面。

推送跳转到N级界面 返回那些事_第2张图片
234.gif

场景N.02 ==> 假如APP 退到后台是在B界面(以A界面为rootVC)点击推送直接跳转到C界面,然后C点击返回返回到B界面,B再返回A界面。

推送跳转到N级界面 返回那些事_第3张图片
345.gif

场景N.03 ==> 假如APP 退到后台是在C界面(以A界面为rootVC)点击推送直接跳转到C界面,然后C点击返回返回到B界面,B再返回A界面。

推送跳转到N级界面 返回那些事_第4张图片
678.gif

以上是简单的场景介绍及演示。
我的做法如下
在三级界面C控制器的返回事件中这样做

- (void)backButtonAction {

    UINavigationController *navigationController = self.navigationController;
    NSMutableArray<__kindof UIViewController *> *tempViewControllers = [NSMutableArray arrayWithArray:navigationController.viewControllers];

    //TODO: 判断栈中是否含有B控制器   如果没有就添加B控制器
    BOOL canAddBVC = YES;
    for(UIViewController*controller in self.navigationController.viewControllers) {
        if([controller isKindOfClass:[BViewController class]]) {
            canAddBVC = NO;
        }
    }
    
    //TODO: 添加B 控制器到第二级
    if (canAddBVC) {
        BViewController *tempBVC = [BViewController new];
        [tempViewControllers insertObject:tempBVC atIndex:1];
        navigationController.viewControllers = tempViewControllers;
    }
    
    
    //TODO: 判断自身控制器在栈中的个数    个数多于一个则移除先入栈的自身
    int selfCountInViewControllers = 0;
    for(UIViewController*controller in tempViewControllers) {
        if([controller isKindOfClass:[CViewController class]]) {
            selfCountInViewControllers++;
        }
    }
    
    //TODO: 移除先入栈的自身
    if (selfCountInViewControllers > 1) {
        [tempViewControllers removeObjectAtIndex:tempViewControllers.count - 2];
        navigationController.viewControllers = tempViewControllers;
    }

    [navigationController popToViewController:navigationController.viewControllers[1] animated:YES];
}

我不知道这样操作栈中元素会不会不合适 所以发出来供大家参考一下,有大神有好的见解还请赐教。

QQ:327116244
Email:[email protected]

你可能感兴趣的:(推送跳转到N级界面 返回那些事)