在 navigationController
中实现方法(注意:self
是 navigationController
):
/**
* push 控制器,并移除之前的 removeNums 个控制器
*
* @param viewController 新 push 的控制器
* @param removeNums 移除前面的控制器数目
*/
- (void)pushViewController:(UIViewController *)viewController
removeForwardControllersNums:(NSUInteger)removeNums;
- (void)pushViewController:(UIViewController *)viewController
removeForwardControllersNums:(NSUInteger)removeNums{
[self pushViewController:viewController animated:YES];
NSMutableArray<UIViewController *> *childVcs = self.childViewControllers.mutableCopy;
for (int index = 0; index < removeNums; index++) {
if (childVcs.count <= 2) {
break;
}
[childVcs removeObjectAtIndex:childVcs.count - 2];
}
[self setViewControllers:childVcs animated:NO];
}
思路:
先
push
到指定的控制器,然后重新设置navigationController
的子控制器
一般情况下,只要移除需要pop的控制器,再添加指定控制器,重设 navigationController
的子控制器,- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated
方法 animated
设置为 YES
即可
NSMutableArray<UIViewController *> *childVcs = self.childViewControllers.mutableCopy;
for (int index = 0; index < removeNums; index++) {
if (childVcs.count <= 2) {
break;
}
[childVcs removeObjectAtIndex:childVcs.count - 2];
}
UIViewController *targetVc = [UIViewController new];
[childVcs addObject:targetVc];
[self setViewControllers:childVcs animated:YES];
但是,上面的方法中,如果 pop
回到了有 tabbar
的控制器,在添加指定控制器,会出现 tabbar
,因此上述方法改为第一种方法实现
无效做法:
移除控制器,再使用 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
方法跳转。这种方法是无法成功跳转到指定控制器的