首页 文章

移回上一个控制器

提问于
浏览
-4

我正在使用以下功能移回以前的控制器

- (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

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

    它维护导航堆栈 . 我们假设有三个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仍然在堆栈上 .

    这是导航控制器的流程 .

    希望你会得到帮助:)

相关问题