2015-12-31 59 views
1

我在我的应用程序委托编码登录网页,其中(该方法应用在中:didFinishLaunchingWithOptions :)设置为与根视图控制器在窗口层次视图不

[self.window setRootViewController:vc]; 

其中,Vc我的根视图控制器是我的HomeVC的实例化。
此视图正确加载。我可以在所有的登录得很好,但所需的数据,只要我试图进入并加载另一种观点认为,我得到

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循环。

我无法理解我试图调用的视图控制器如何不在层次结构中,因为它不仅显示正确,而且也是根本层次上的只有视图。编辑1:我将包含AppDelegate应用程序:didFinishLaunchingWithOptions:方法的部分,我创建并添加VC和导航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]; 
+0

'[UIApplication sharedApplication] .window.rootViewController'的结果是什么? (你必须将它转换为你的UIApplicationDelegate的类型) – chedabob

+0

它也不会触及那个while循环,因为'presentedViewController'是通过'presentViewController:animated:completion:' – chedabob

+0

尝试编译代码时出现错误,您的意思是keyWindow而不是窗口?因为 'AppDelegate * app =(AppDelegate *)[UIApplication sharedApplication] .window.rootViewController' 刚结束时出现错误,说明在'UIApplication *类型的对象上找不到'属性'窗口'。 如果你的意思是keyWindow,你会注意到在我的黑客中我实际上使用了精确的代码来获得最高控制器,这就是我最终返回的结果。 对于那个循环我应该用什么来使它工作? –

回答

0

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

试试这样:如果你确定有一个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; 
} 
+0

好吧,所以没有任何if语句评估为真,它只是返回传入的viewController。虽然值得一试。 –

+0

此警告通常出现在故事​​板中,当它试图同时执行2个赛段时。我相信在你试图同时呈现2个视图控制器的时候。 – ShaluRaj

+0

您是否尝试将导航控制器设置为rootviewcontroller,[self.window setRootViewController:_navigationController]; – ShaluRaj

相关问题