「アプリケーションはモーダルにアクティブなコントローラーを提示しようとしました」?


100

NSInvalidArgumentExceptionこれまで実行していなかったアプリで、このメッセージが表示されているクラッシュに遭遇しました。

アプリケーションがアクティブなコントローラーUITabBarController:0x83d7f00をモーダルに提示しようとしました。

UITabBarController作成したものがAppDelegateあり、の配列を渡しUIViewControllersます。

そのうちの1つは、タップしたときにモーダルで表示したいものです。デリゲートメソッドを実装して

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

そのView Controllerがモーダルで提示したいクラスのクラスである場合、NOを返し、実行します

[tabBarController presentModalViewController:viewController animated:YES];

そして今、私はそのエラーを得ています、それはどこかでアクティブなビューコントローラーをモーダルに表示できないことを意味しているようです(タブバーで...)私はXCode 4.2 Developer Preview 7にいると言う必要がありますこれはiOS 5です(NDAについては知っていますが、私は禁止されている詳細については触れていません)。私は現在、これがiOS4 SDKに対してコンパイルするときにクラッシュするかどうかをテストするためのXCodeインストールを持っていませんが、そうでないことをほぼ完全に確信しています。

私は誰かがこの問題を経験したか、何か提案があるかどうか尋ねたかっただけです


iOS 5より前のバージョンでは、例外は発生しませんでしたが、何も返されませんでした。iOS 5以降、このコマンドは例外を発生させます。
フレデリック・ダッダ

回答:


103

次のようにインスタンス化された3つのView Controllerがあるとします。

UIViewController* vc1 = [[UIViewController alloc] init];
UIViewController* vc2 = [[UIViewController alloc] init];
UIViewController* vc3 = [[UIViewController alloc] init];

次のようにタブバーに追加しました:

UITabBarController* tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]];

今、あなたはこのようなことをやろうとしている:

[tabBarController presentModalViewController:vc3];

このタブバーコントローラーには、指定したビューコントローラーにデスグリップがあるため、エラーが発生します。タブバーのビューコントローラの配列に追加することも、モーダルで表示することもできません。

Appleは、UI要素を特定の方法で扱うことを期待しています。これはおそらく、「これを実行する必要があるとは期待していないため、実行しないでください」としてヒューマンインターフェイスガイドラインのどこかに埋め込まれています。


6
問題は、これはiOS 5より前のバージョンではまったく問題がなかったことです。私がしたことは、ダミーのUIViewControllerをタブバーに追加して、実際のビューコントローラーサブクラスインスタンスをモーダルに表示することでした。
Javier Soto、

1
@Iswank、現在iOS 6で物事をより簡単にするため、presentModalViewControllerを非推奨にし、あらゆる種類の回転問題を引き起こしています... presentViewController:animated:completeを使用して、アプリが変更をどのように処理しているかを確認する
whyoz

15

私は同じ問題を抱えています。閉じた直後にビューコントローラーを表示しようとします。

[self dismissModalViewControllerAnimated:YES];

私がアニメーションなしでそれをやろうとすると、それは完璧に機能するので、問題はコントローラーがまだ生きているということです。最良の解決策はdismissViewControllerAnimated:completion:iOS5 に使用することだと思います


モーダルビューコントローラーを再度表示するときまでに、モーダルは画面上にモーダルであり、アニメーション化されているため、アニメーション化を解除すると失敗します。
Pascal

2
IOS 6.0で価格が下げられています
Sumit Kumar Saha

12

私の場合、私はさまざまなビューコントローラーからviewController(私はTabBarViewControllerにviewControllerの参照を持っています)を表示しようとしましたが、上記のメッセージでクラッシュしました。その場合、提示を避けるために使用できます

viewController.isBeingPresented

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

誰かを助けるかもしれません。


viewWillappperarでのみ機能しますが、すでに表示されているviewControllerを表示する前に確認すると、常にfalseが返されます。
グル、

1
私のために働いていません。それでもアプリがクラッシュします。(!viewController.presentingViewController)は問題を解決しました。
アーガス

3

同じ問題がありました。解決しました。あなたはこのコードを試すことができます:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];

2

presentではUINavigationViewControllerなく子View Controller を試したときに同じ問題エラーが発生しました


0

削除するだけ

[tabBarController presentModalViewController:viewController animated:YES];

そして保つ

[self dismissModalViewControllerAnimated:YES];

これは非推奨の警告を与えます...それでこれの代替は何ですか?
Kirtikumar A. 2013

ここでは[blockSelf dismissViewControllerAnimated:YES completion:nil]を使用しました。
Kirtikumar A. 2013

0

代わりに:

self.present(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?)

あなたは使うことができます:

self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)

0

私の場合、自分自身を提示することになっていrootViewControllerUINavigationControllerときに私が提示していましたUINavigationController

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.