私のアプリでは、ナビゲーションコントローラーを使用しています。後でいくつかのビューpresentViewController
で、ズームした画像を表示するために使用しています。また、ストーリーボードやペン先は使用していません。
このエラーはiOS 7でのみ発生します。iOS 6以前では正常に動作します。
切り離されたView ControllerにView Controllerを提示することはお勧めしません
私のアプリでは、ナビゲーションコントローラーを使用しています。後でいくつかのビューpresentViewController
で、ズームした画像を表示するために使用しています。また、ストーリーボードやペン先は使用していません。
このエラーはiOS 7でのみ発生します。iOS 6以前では正常に動作します。
切り離されたView ControllerにView Controllerを提示することはお勧めしません
回答:
プッシュナビゲーションで警告が表示されないようにするには、直接使用できます。
[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];
そして、モーダルビューコントローラーで、すべてが完了したら、次のように呼び出すだけです。
[self dismissViewControllerAnimated:YES completion:nil];
self.navigationController
してくれました。
この警告の理由は、フルサイズのビューではない小さなビューの上にビューコントローラーを表示していたためです。以下は私のプロジェクトのイメージです。上の4つのオプションをクリックしてください。ユーザーは別のchildviewcontrollerのビューに移動します(tabViewcontrollerのように機能します)。ただし、childviewcontrollerには小さなサイズのビューが含まれています。そのため、childviewcontrollerからビューを提示すると、この警告が表示されます。
これを回避するには、childviewcontrollerの親にビューを表示できます
[self.parentViewController presentViewController:viewController animated:YES completion:nil];
待つviewDidAppear()
:
このエラーは、ビューを実際に表示する前にビューコントローラーを表示しようとした場合にも発生しますviewWillAppear()
。その後ろviewDidAppear()
または内部に別のビューを表示してみてください。
viewDidLoad()
、人々にビューコントローラを表示しないでください!私は何度もこの間違いを犯しました...
私の場合、sampleViewController
サブビューとして追加されたのビューを使用して、ビューsampleViewController
(ここself
ではUIViewController
インスタンス)からポップオーバーを表示しようとします。
[self.view addSubview:sampleViewController.view];
正しい方法は以下のとおりです。
// make sure the vc has been added as a child view controller as well
[self addChildViewController:sampleViewController];
[self.view addSubview:sampleViewController.view];
[sampleViewController didMoveToParentViewController:self];
ところで、これは、テーブルビューセルからポップオーバーを表示する場合にも機能します。テーブルビューコントローラが子ビューコントローラとして追加されていることを確認するだけです。
[self addChildViewController:sampleViewController];
、ありがとうございました、今私はこれを追加
問題は、適切なView Controller階層がないことだと思います。アプリのrootviewcontrollerを設定し、新しいビューコントローラーをプッシュまたは表示することで新しいビューを表示します。各View Controllerにビューを管理させます。tabbarviewcontrollerのようなコンテナービューコントローラーのみが、他のビューコントローラービューを独自のビューに追加する必要があります。ビューコントローラを適切に使用する方法の詳細については、ビューコントローラプログラミングガイドをお読みください。https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/
ほぼ同じ問題があります。その理由は、「一部の」コントローラーを別のコントローラーに提示しようとしたため、アニメーションが完了した後、提示されたコントローラーをルートとして設定していたためです。この操作の後、それ以上のすべてのコントローラーを提示すると警告が表示されます:「切り離されたビューコントローラーでのビューコントローラーの提示は推奨されません」そして、私はこの警告をルートとして「一部の」コントローラーを設定するだけで解決し、最初は何も表示しません。
削除:
[[self rootController] presentViewController:controller animated:YES completion:^{
[self window].rootViewController = controller;
[[self window] makeKeyAndVisible];}];
プレゼンテーションなしでrootとして作成します。
[[self window] setRootViewController:controller];
TabBarController
それがTabBarController
ベースのアプリである場合は、プレゼンしてみてください。
[self.tabBarController presentViewController:viewController animated:YES completion:nil];
理由self
はの子でTabBarController
あり、から提示しようとしていChildViewController
ます。
はい、別のビューにあるアラートコントローラを表示しているときにも、同じ警告メッセージが表示されました。後で私は、以下のように親ビューコントローラーからアラートコントローラーを提示することでこれを回避しました:
[self.parentViewController presentViewController:alertController animated:YES completion:nil];
新しいコントローラーを親ビューコントローラーの子として表示するビューコントローラーを追加する必要があります。
yourMainViewControllerがあり、controllerAという新しいコントローラーを追加して、controllerAからcontrollerBという新しいコントローラーを表示するとします。
次のように書く必要があります:
[self addChildViewController:controllerA]; //self is yourMainViewController
[self.view addsubView:controllerA.view];
そしてcontrollerA内で警告なしに新しいコントローラを提示できます
[self presentViewController:controllerB animated:YES completion:nil]; //self is controllerA
Swift 4.1およびXcode 9.4.1の場合
解決策は
DispatchQueue.main.async(execute: {
self.present(alert, animated: true)
})
このように書いた場合、同じエラーが発生します
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
})
alert.addAction(defaultAction)
present(alert, animated: true, completion: nil)
同じエラーが出ます
Presenting view controllers on detached view controllers is discouraged <MyAppName.ViewController: 0x7fa95560Z070>.
完全なソリューションは
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
})
alert.addAction(defaultAction)
//Made Changes here
DispatchQueue.main.async(execute: {
self.present(alert, animated: true)
})
このスレッドで、カスタムナビゲーションバーがあり、そこからAlertViewControllerを呼び出していました。
メインのビューコントローラーに子として追加する必要がありました。それから私は何の警告もなくそれを提示することができました。
をZoomed Image View Controller
メインのViewControllerの子として追加する必要があります。
(例えば)
[self addChildViewController:ZoomedImageViewController];
その後、ZoomedImageViewControllerを呼び出すことができます。
[self presentViewController:ZoomedImageViewController];
多くの答えは正しいです。
この問題は、同僚がAViewControllerをBViewControllerに追加したときに発生しました。どういうわけか、彼はAViewControllerのビューをBViewControllerのビューに追加するだけです。
追加bViewController.addChild(aViewController)で修正されました
UIViewControllerのどこにでもアラートや同様のものを表示するかどうかによって異なります。
次のコード例を使用できます。
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Example" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:nil];
[alert addAction:cancelAction];
[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:alert animated:true completion:nil];
Attempt to present <UIAlertController: 0x7fc01a1eb600> on <ViewController: 0x7fc019821e00> whose view is not in the window hierarchy!