移回上一个控制器

时间:2016-04-15 12:15:52

标签: ios objective-c uiviewcontroller

我正在使用以下功能移回上一个控制器

- (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 个答案:

答案 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保留在堆栈上。

这是导航控制器的流程。

希望你能得到帮助:)