【问题标题】:How to push a view to the navigation stack and remove the current one?如何将视图推送到导航堆栈并删除当前视图?
【发布时间】:2013-01-02 17:26:14
【问题描述】:

我想将一个视图推送到导航控制器堆栈中,但删除当前的视图,这样当用户按下下一个视图时,它不会将他们带到上一个视图。

一个方向的流动可能是以下之一:

View X -> View 1 -> View 2 -> View 3    
View X -> View 1      ->      View 3

但反方向的流动总是这样:

View X <- View 1      <-      View 3

问题是我想在 View 2 控制器上处理它,在 View 3 上处理它很容易覆盖后退按钮操作。 View 3 可以是很多不同的视图,我不想覆盖所有视图的后退按钮并检查堆栈的前一个控制器是否是 View 2 控制器。它们都有相同的父类,所以我不能只为“View 3 class”控制器覆盖后退按钮。

我已经尝试过了,所以 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];

【问题讨论】:

  • 你需要使用 unwind segues。
  • 对不起,我忘了说它必须与 5.1 兼容
  • 啊,那么唯一的办法就是弹出两次。您不能直接执行您要查找的操作,但您可以调用 popViewController 两次,或者您可以执行 popToViewController 并传入 View 1 以直接返回 View 1。
  • 是的,从 View Controller 3 我可以弹出两次,但我需要在 View Controller 2 上执行,在推送到下一个视图之前或之后从堆栈中删除视图
  • 不,你没有。您可以从 VC3 弹出两次。不知道为什么你认为你需要删除 VC2?

标签: objective-c ios5 uiviewcontroller uinavigationcontroller uitableview


【解决方案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)
      }

【讨论】:

    【解决方案2】:

    关于你最后一个没有推动的例子,这行得通吗?

    NSMutableArray *viewControllers = [NSMutableArray arrayWithArray: self.navigationController.viewControllers];
    [viewControllers removeObjectIdenticalTo:self];
    [viewControllers addObject:controller];
    [self.navigationController setViewControllers: viewControllers animated: YES];
    

    由于您将控制器设置为没有您自己的控制器数组,您可能会将您的 navigationController 属性设置为 nil,从而使您无法立即推送新的控制器。反正试一试也无妨。

    【讨论】:

    • 是的!!,成功了!它对导航栏的标题产生了一种奇怪的效果(它有点定制),但至少正在移动到下一个视图并返回正确的视图,所以它似乎是要走的路。谢谢!
    • @pablobart 很高兴我能帮助你。 :)
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多