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