移回上一个控制器
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 保留在堆栈中。
这是导航控制器的流程。
希望你能得到帮助:)
【讨论】:
以上是关于移回上一个控制器的主要内容,如果未能解决你的问题,请参考以下文章