UIViewController 没有弹出到 root?

UIViewController not popping to root?

一些细节:

InitialController 是故事板入口点。在那里我检查我是否登录并执行到主应用程序页面的 segue,或者如果我没有登录控制器则执行 segue。

即在InitialController(这是一个UINavigationController)我有

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidLoad];
    if ([already logged in]) {
        [self performSegueWithIdentifier:@"toMain" sender:self];
    } else {
        [self performSegueWithIdentifier:@"toLogin" sender:self];
    }
}

如果我走登录路线,我会看到我的视图控制器看起来像这样(使用内部 _printHierarchy 方法)

<InitialController 0x7fbdfc81c200>, state: appeared, view: <UILayoutContainerView 0x7fbdfa3b8910>
   | <LoginController 0x7fbdfa01be50>, state: disappeared, view: <UIView 0x7fbdf9631670> not in the window
   | <AnotherController 0x7fbdfe286e00>, state: appeared, view: <UIView 0x7fbdfe12b680>

当我在 AnotherController 上完成操作时,我调用 popToRootViewController...这很烦人地把我带到 LoginController 但我试图通过将此方法添加到 LoginController 来解决这个问题

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (...) { // is only true when I want it to be true
        [self.navigationController popToRootViewControllerAnimated:NO];
    }
}

我设置了一个断点,在我调用这个 popToRoot 方法之前再次打印层次结构...我得到:

<InitialController 0x7fbdfc81c200>, state: appeared, view: <UILayoutContainerView 0x7fbdfa3b8910>
   | <LoginController 0x7fbdfa01be50>, state: appeared, view: <UIView 0x7fbdf9631670>

但它仍然停留在 LoginController,尽管我想回到 InitialController。为什么不让我回到 InitialController? 我猜这可能与它们都出现的事实有关,所以也许 LoginController 以某种方式被视为根或与 UILayoutContainerView?

有关

旁注: 我也尝试不将 InitialController 设为 UINavigationController,然后视图层次结构变为:

<InitialController 0x7fcddac9da30>, state: disappeared, view: <UIView 0x7fcddb35e500> not in the window
   + <LoginController 0x7fcddaf02eb0>, state: appeared, view: <UIView 0x7fcddb3635a0>, presented with: <_UIFullscreenPresentationController 0x7fcddb103700>

这又不允许我弹出到 InitialController

UINavigationController 是一个管理堆栈 viewController 的容器(不包括自身)。 UINavigationController 的 rootViewController 是该堆栈中的第一个 viewController,因此这就是 popToRootViewControllerAnimated: 将引导您到的地方。 您不应该将您的内容直接放入 UINavigationController。

我的建议是让故事板入口点成为一个单独的 UINavigationController,然后包含 InitialController 作为其堆栈中的第一个 viewController(应该是 UIViewController,而不是 UINavigationController)。然后,当您在 UINavigationController 上调用 popToRootViewControllerAnimated: 时,您将被带到 InitialController。