【发布时间】:2016-04-20 12:22:24
【问题描述】:
一些细节:
InitialController 是故事板的入口点。在那里我检查我是否已登录并执行到主应用程序页面的转场,或者如果我没有,那么我执行转场到登录控制器。
即在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 吗?
【问题讨论】:
标签: objective-c uiviewcontroller uinavigationcontroller uistoryboard uistoryboardsegue