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。
一些细节:
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。