【问题标题】:UIViewController not popping to root?UIViewController 没有弹出到根目录?
【发布时间】: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


    【解决方案1】:

    UINavigationController 是一个容器,用于管理视图控制器堆栈(不包括自身)。 UINavigationController 的 rootViewController 是该堆栈中的第一个 viewController,因此 popToRootViewControllerAnimated: 将引导您。 您不应该将您的内容直接放入 UINavigationController。

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

    【讨论】:

    • 是的,结果证明 UINavigationController 不可能是它自己的独立根。不知道谢谢
    猜你喜欢
    • 2015-09-27
    • 2019-12-25
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多