アプリデリゲートでモーダルビューコントローラーを作成しようとしています(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からモーダル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
からのモーダルビューの表示が機能しました。
この警告の別の理由として、最上位のView ControllerではないインスタンスからView Controllerを表示したいことが考えられます。
したがって、最初に最上位の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];
});
お役に立てれば !