我想将视图推入导航控制器堆栈但删除当前的视图,这样当用户按下下一个视图时,它不会将它们带到上一个视图。
一个方向的流动可能是其中之一:
View X -> View 1 -> View 2 -> View 3
View X -> View 1 -> View 3
但是,相反方向的流动总是如下:
View X <- View 1 <- View 3
问题是我想在View 2 Controller上处理它,在View 3上执行它很容易覆盖后退按钮操作。 View 3可以有很多不同的视图,我不想覆盖所有这些视图的后退按钮,并检查堆栈的前一个控制器是否是View 2 Controller。它们都具有相同的父类,因此我无法仅覆盖“View 3类”控制器的后退按钮。
我试过这个,所以View 2的控制器没有添加到导航堆栈中:
//Pop controller from stack before pushing
[self.navigationController popViewControllerAnimated:YES];
[self.navigationController pushViewController:controller animated:YES];
但是一旦弹出它就会移除视图并且不会推送到下一个控制器
具有相同结果的其他选项
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray: self.navigationController.viewControllers];
[viewControllers removeObjectIdenticalTo:self];
self.navigationController.viewControllers = viewControllers;
[self.navigationController pushViewController:controller animated:YES];
答案 0 :(得分:11)
关于你最后一个没有推动的例子,这有用吗?
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray: self.navigationController.viewControllers];
[viewControllers removeObjectIdenticalTo:self];
[viewControllers addObject:controller];
[self.navigationController setViewControllers: viewControllers animated: YES];
由于您在没有自己的情况下将控制器设置为控制器阵列,因此您可能将navigationController
属性设置为nil
,使您无法立即推送新属性。反正尝试也没有什么坏处。
答案 1 :(得分:1)
我也有一个类似的用例,这是我在Swift 5中提出的解决方案:
if var controllers = self.navigationController.viewControllers {
// finding 'View 2' to remove from navigation stack
if let index = controllers.firstIndex(of: 'View 2') {
controllers.remove(at: index)
}
controllers.append('View 3') // adding new viewController to navigation stack
// this will update the navigation stack with system animation
self.rootNavController.setViewControllers(controllers, animated: true)
} else {
// fallback scenario
self. self.navigationController.pushViewController('View 3', animated: true)
}