私のアプリでは、ナビゲーション コントローラーを使用しています。後でpresentViewController
、ズームされた画像を表示するために使用しているビューで。また、ストーリーボードやペン先は使用していません。
iOS 7 でのみこのエラーが発生します。iOS 6 以前では問題なく動作します。
デタッチされたView ControllerでView Controllerを提示することはお勧めできません
私のアプリでは、ナビゲーション コントローラーを使用しています。後でpresentViewController
、ズームされた画像を表示するために使用しているビューで。また、ストーリーボードやペン先は使用していません。
iOS 7 でのみこのエラーが発生します。iOS 6 以前では問題なく動作します。
デタッチされたView ControllerでView Controllerを提示することはお勧めできません
この警告の理由は、フル サイズのビューではない小さなビューにビュー コントローラーを表示していたことです。以下は私のプロジェクトのイメージです。上記の 4 つのオプションをクリックします。ユーザーは別の childviewcontroller のビューに移動します (tabViewcontroller のように機能します)。ただし、childviewcontroller には小さなサイズのビューが含まれています。したがって、childviewcontroller からビューを提示すると、この警告が表示されます。
これを避けるために、childviewcontroller の親にビューを提示できます。
[self.parentViewController presentViewController:viewController animated:YES completion:nil];
私の場合、のビューをサブビューとして追加し、 (ここでは代わりにインスタンス)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 rootController] presentViewController:controller animated:YES completion:^{
[self window].rootViewController = controller;
[[self window] makeKeyAndVisible];}];
プレゼンテーションなしでルートとして作成するだけです:
[[self window] setRootViewController:controller];
[self.navigationController presentViewController:xxx animated:YES completion:nil]
iOS8で使用。
これに対する解決策の 1 つは、childviewcontroller がある場合です。
[self.parentViewController presentViewController:viewController animated:YES completion:nil];
却下には、同じ却下ビュー コントローラを使用します。
[self dismissViewControllerAnimated:YES completion:nil];
これは私にとって完璧な解決策です。
はい、別のビューにあった Alert コントローラーを表示しているときに、同じ警告メッセージが表示されました。後で、以下のように親ビュー コントローラーからアラート コントローラーを提示することで、これを回避しました。
[self.parentViewController presentViewController:alertController animated:YES completion:nil];
新しいコントローラーを親View Controllerの子として表示するView Controllerを追加する必要があります。
あなたのMainViewControllerがあり、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
カスタムナビゲーションバーがあり、それを介して AlertViewController を呼び出していたこのスレッドに到達しました。
メインのView Controllerに子として追加する必要がありました。その後、何の警告もなしにpresent itを呼び出すことができました。
Zoomed Image View Controller
メインの ViewController の子として追加する必要があります。
(例えば)
[self addChildViewController:ZoomedImageViewController];
次に、 ZoomedImageViewController を呼び出すことができます
[self presentViewController:ZoomedImageViewController];
この警告には多くの理由があります。私の理由は、ViewController からモーダルに表示される別の ViewController にセグエが接続されているためです。しかし、私が提示しているViewControllerは、PageViewControllerによって動的に生成されています。これが、ストーリーボードで分離されている理由です。それが原因でアプリがクラッシュすることはありません。しかし、私は警告を黙らせたいと思います。