【问题标题】:Root View Controller's view not in the Window Hierarchy根视图控制器的视图不在窗口层次结构中
【发布时间】:2016-04-05 00:09:41
【问题描述】:

我编写了一个登录页面,在我的应用程序委托(在方法 application:didFinishLaunchingWithOptions:) 中设置为我的根视图控制器

[self.window setRootViewController:vc];

其中 vc 是我的 HomeVC 的实例化。
此视图正确加载。我可以很好地输入登录所需的所有数据,但是一旦我尝试加载另一个视图,我就会得到 ​​p>

Warning: Attempt to present <RegisterVC: 0x7d07f520> on 
         <HomeVC: 0x7d374830> whose view is not in the window hierarchy!

我尝试了一些小技巧,以确保我使用以下代码获得了最顶层的视图控制器:

- (UIViewController*) topMostController
{
    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;

    while (topController.presentedViewController) {
        topController = topController.presentedViewController;
    }

    return topController;
}

但是,正如我所怀疑的,它只返回了当前视图控制器,它也是根视图控制器。它甚至从不进入 while 循环。

我无法理解我试图调用的视图控制器如何不在层次结构中,因为它不仅显示正确,而且完全是层次结构上的 only 视图。

编辑 1:我将包含 AppDelegate 应用程序:didFinishLaunchingWithOptions: 方法的部分,我在其中创建和添加 VC 和 Navigation VC。

    UIViewController *vc = (HomeVC *)[[HomeVC alloc] initWithNibName:NSStringFromClass([HomeVC class]) bundle:nil];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:vc];
    [self.navigationController setNavigationBarHidden:YES];

    [self.window setRootViewController:vc];
    //^^^This is the line I'm most suspicious of, is that correct?^^^
    [self.window setBackgroundColor:[UIColor colorWithHexString:kDefaultBackgroundColor]];
    [self.window makeKeyAndVisible];

【问题讨论】:

  • [UIApplication sharedApplication].window.rootViewController 的结果是什么? (你必须将它转换为你的 UIApplicationDelegate 的类型)
  • 它也不会触发 while 循环,因为 presentedViewController 用于通过 presentViewController:animated:completion: 以模态方式呈现的 VC(你的不是)
  • 我在尝试编译您的代码时遇到错误,您的意思是 keyWindow 而不是 window?因为AppDelegate * app = (AppDelegate *)[UIApplication sharedApplication].window.rootViewController 最终会出现一个错误,说“在 UIApplication * 类型的对象上找不到属性‘窗口’”。如果您的意思是 keyWindow,您会注意到在我的 hack 中,我实际上使用该确切代码来获取顶级控制器,这就是我最终返回的内容。对于那个循环,我应该用什么让它工作?
  • 或者我应该创建一个虚拟的“根视图控制器”样式类,只添加这个 HomeVC 而不是让根成为主视图控制器?
  • @MatthewBahr 您如何从 HomeVC 加载另一个视图?

标签: ios objective-c model-view-controller uiview-hierarchy


【解决方案1】:

你可以得到窗口的根视图控制器,应该是导航控制器,然后得到它的顶视图控制器。

试试这样:如果你确定有 viewController.presentedViewController 然后发送 includeModal 为 YES。

- (UIViewController *)topmostViewControllerFrom:(UIViewController *)viewController
                               includeModal:(BOOL)includeModal
{
    if ([viewController respondsToSelector:@selector(selectedViewController)])
    return [self topmostViewControllerFrom:[(id)viewController selectedViewController]
                              includeModal:includeModal];

    if (includeModal && viewController.presentedViewController)
    return [self topmostViewControllerFrom:viewController.presentedViewController
                              includeModal:includeModal];

    if ([viewController respondsToSelector:@selector(topViewController)])
    return [self topmostViewControllerFrom:[(id)viewController topViewController]
                              includeModal:includeModal];

    return viewController;
}

【讨论】:

  • 好的,所以尝试过没有任何 if 语句评估为 true,它只返回传入的 viewController。不过值得一试。
  • 当 Storyboard 试图同时执行 2 个 segue 时,通常会出现此警告。我相信在 appdelegate 中,您正试图同时呈现 2 个视图控制器。
  • 你试过设置导航控制器为rootviewcontroller吗,[self.window setRootViewController:_navigationController];
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多