有没有开发的童鞋和我一样遇到过这样的需求: 正常进入APP时跳转逻辑是这样的 A push to ----> B push to ----> C C pop to ----> B pop to ----> A 或者 C pop to ----> A
123.gif
推送点击跳转产品要求是这样的 场景N.01 ==> 假如APP 退到后台是在A界面(以A界面为rootVC)点击推送直接跳转到C界面,然后C点击返回返回到B界面,B再返回A界面。
234.gif
场景N.02 ==> 假如APP 退到后台是在B界面(以A界面为rootVC)点击推送直接跳转到C界面,然后C点击返回返回到B界面,B再返回A界面。
345.gif
场景N.03 ==> 假如APP 退到后台是在C界面(以A界面为rootVC)点击推送直接跳转到C界面,然后C点击返回返回到B界面,B再返回A界面。
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];
}
我不知道这样操作栈中元素会不会不合适 所以发出来供大家参考一下,有大神有好的见解还请赐教。