移回上一个控制器

Posted

技术标签:

【中文标题】移回上一个控制器【英文标题】:Move Back to previous controller 【发布时间】:2016-04-15 12:15:52 【问题描述】:

我正在使用以下函数返回到上一个控制器

- (void) onBack:(id) sender 
   [[self navigationController] popViewControllerAnimated:NO];

在正常情况下工作正常,但当我转到超过 1 个视图控制器时出现问题。

如果我从 Viewcontroller1 移动到 ViewController2 然后到 Viewcontroller3

如果我按下返回按钮,则从 Viewcontroller3 转到 ViewController2,如果我转到 ViewController3 并返回到 Viewcontroller2。从 ViewController2 如果我按下返回按钮,它必须转到 ViewController1 而不是它将转到 ViewController3

谁能帮我解决这个问题。

我正在使用以下代码从一个控制器移动到另一个控制器(仅一个示例)

[[NSNotificationCenter defaultCenter] addObserverForName:NotificationEditProfile
     object:nil
     queue:[NSOperationQueue mainQueue]
     usingBlock:^(NSNotification *notification) 
     HUEditProfileViewController *editHUProfileViewController = [[HUEditProfileViewController alloc] initWithNibName:@"EditProfileView" bundle:nil];
     editHUProfileViewController.isLocationEnabled = true;
     [_navigationController pushViewController:editHUProfileViewController animated:NO];
                                              ];

【问题讨论】:

如果想回到1,可以使用:popToRootViewControllerAnimated from any。 这当然不可能,您必须在两者之间更改导航堆栈,请仔细检查您的实现。 是您嵌入的导航控制器 Khurram Shehzad:实际上,如果我从 ViewController1 -> ViewController2->ViewController3... 按下返回按钮,它会进入 ViewController2,然后当我按下返回按钮 Viewcontroller2 时,它会进入视图控制器 1。但是当我第二次从 ViewController2 转到 ViewController3 时,问题就出现了,然后才开始出现问题(我猜这与 Viewcontrollers 的数量有关)但不确定 在你的故事板上显示你的视图层次结构,或者显示你是如何在视图控制器之间移动的。 【参考方案1】:

我试图解释导航控制器的工作原理。

它是维护导航堆栈。假设有 A、B 和 C 三个 ViewContoller。

最初导航栈是空的,所以栈顶是空的。

当您将 A 设置为 rootviewController 时,它将成为堆栈顶部。堆栈顶部始终在屏幕或窗口上可见。

现在,如果您将 B 推到 A 上,那么 B 将成为堆栈顶部,因此 B 在主屏幕上可见。所以现在你的导航堆栈就像 A -> B(顶部)。

现在,如果您按下 C,那么堆栈将像这样 A->B->C(顶部)。所以,c 就在你面前或主屏幕上。

如果现在您弹出视图控制器,这意味着您是导航堆栈中的removing 堆栈顶部。因此,如果您调用 popViewController,则从堆栈中删除 C,因此您的堆栈现在是 A->B(top)。

再次按 C 然后按 A->B->C(顶部)

再次弹出然后 A->B(top)

再次弹出,然后是 A(顶部)。

所以栈顶总是可见的,早期的 vc 保留在栈中。但是当你弹出时,顶部会从堆栈中删除。

所以,如果您从 B 转到 C 并按回,然后再次回到 B 很好,但是当您从 B 回按时,它就来到了 A,因为您已经从堆栈中删除了 C,而 B 是堆栈的顶部,您是将删除它,因此只有 A 保留在堆栈中。

这是导航控制器的流程。

希望你能得到帮助:)

【讨论】:

以上是关于移回上一个控制器的主要内容,如果未能解决你的问题,请参考以下文章

从导航控制器移回视图控制器?

push

状态恢复后,dismissViewControllerAnimated 没有使用相同的动画

如何在解除第二个控制器后调用第一个控制器中的函数

如何从控制器路由 Rails 4 获得不同的和多个视图

导航视图控制器不显示后退按钮