我正在使用以下功能移回以前的控制器
- (void) onBack:(id) sender {
[[self navigationController] popViewControllerAnimated:NO];
}
它在正常情况下工作正常,但是当我转到多个viewcontroller时会出现问题 .
如果我从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 回答
我试图解释导航控制器的工作原理 .
它维护导航堆栈 . 我们假设有三个ViewContoller,如A,B和C.
最初naviagtion堆栈为空,因此堆栈顶部为空 .
当你将A设置为rootviewController时,它将成为堆栈顶部 . 堆栈顶部始终在屏幕或窗口上可见 .
现在,如果你在B上按B,那么B成为堆栈顶部,因此B在主屏幕上可见 . 所以现在你的导航堆栈就像A - > B(顶部) .
现在,如果你推C,那么堆栈就像这样A-> B-> C(顶部) . 所以,c在你面前或在主屏幕上 .
如果现在您弹出视图控制器,这意味着您是导航堆栈中的堆栈顶部
removing
. 因此,如果你调用popViewController,那么从堆栈中删除C,所以你的堆栈现在是A-> B(顶部) .再次推C然后A-> B-> C(上)
再次弹出然后A-> B(顶部)
再次弹出A(顶部) .
因此堆栈的顶部始终可见,而早期的vc仍然在堆栈中 . 但是当你弹出然后top从堆栈中删除 .
所以,如果你从B转到C然后按回来然后再来B再好但是当你从B按回来然后它来到A因为你已经从堆栈中删除了C而B是堆栈顶部而你要删除它只有A仍然在堆栈上 .
这是导航控制器的流程 .
希望你会得到帮助:)