我试图做一个模式视图控制器在我的应用程序委托(我创建了一个名为showLoginView功能)。 但每当我尝试调用它,我得到在Xcode中的警告:
Warning: Attempt to present <PSLoginViewController: 0x1fda2b40> on <PSViewController: 0x1fda0720> whose view is not in the window hierarchy!
下面是该方法的代码:
- (void)showLoginView
{
PSLoginViewController *loginViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"PSLoginViewController"];
[self.window.rootViewController presentViewController:loginViewController animated:NO completion:nil];
}
我如何添加视图到窗口层次? 或者,也许我做得非常不对?
你不能显示来自的appDelegate模态视图控制器。 你需要从显示的viewController为准当前显示全屏模态视图控制器。 换句话说,你需要把这些代码到你的根视图控制器,或任何一个你想显示从模式VC ...
另外,你要使用的方法“presentModalViewController”呈现模式。 您可以设置在模式VC如属性:
vC.modalPresentationStyle = UIModalPresentationFormSheet;
vC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:vC animated:YES];
实际上,你可以,只要你检测当前可见的viewController,并采取在那里你当前控制器是navigationController的情况下照顾呈现从AppDelegate中模态视图控制器。
这是我做的:
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]]) {
activeController = [(UINavigationController*) activeController visibleViewController];
}
[activeController presentModalViewController:loginViewController animated:YES];
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]])
{
activeController = [(UINavigationController*) activeController visibleViewController];
}
else if (activeController.modalViewController)
{
activeController = activeController.modalViewController;
}
[activeController presentModalViewController:vc animated:YES];
我遇到了在iOS 7这个问题 - 关键作任何提出的解决方案的工作是调用
[self.window makeKeyAndVisible];
在你AppDelegate
。 该呼叫后,呈现从窗口的一个模式的看法rootViewController
工作。
另一个原因是该警告可以是你想从一个实例,它是不是最顶部的视图控制器呈现视图控制器。
所以,首先你必须得到最顶层的UIViewController,并使用此实例调用presentViewController:
UIViewController *root = [UIApplication sharedApplication].keyWindow.rootViewController;
while (root.presentedViewController) {
root = root.presentedViewController;
}
你可以的NSLog(@ “%@”,self.window.rootViewController),并看到什么RootViewController的真实面目。
我来到了这个问题,当RootViewController的是一个正常的UIViewController。 有一个UINavigationController替换它,希望它会有所帮助。
尝试从其他控制器的代表的呼叫控制器呈现面对这个问题。 即:与委托节目搜索过滤器,一旦做回我的控制器,并通过委托那么当前控制器接收数据,所有我需要做的就是派遣本代码的原因,而在你在另一个线程是一个代表,这就是为什么你“重新呈现从主线程您的观点与其他线程另一个控制器,所以不得不返回主线程,只是把呈现这样的代码:
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:searchVC animated:true completion:nil];
});
希望这可以帮助 !