web-dev-qa-db-ja.com

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

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

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

UITabBarControllerAppDelegateを作成し、UIViewControllersの配列を指定します。

それらの1つは、タップしたときにモーダルで表示したいです。私はデリゲートメソッドを実装することでそれをしました

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

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

[tabBarController presentModalViewController:viewController animated:YES];

そして今、私はそのエラーを受け取っています、それはあなたが他のどこかでアクティブなView Controllerをモーダルに提示できないことを意味しているようです(タブバーで...)私はXCode 4.2 Developer Preview 7を使用しているこれはiOS 5です(NDAについては知っていますが、禁止されている詳細は提供していないと思います)。現在、iOS4 SDKに対するコンパイルがクラッシュするかどうかをテストするXCodeのインストールはありませんが、そうでないことはほぼ確実です。

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

90
Javier Soto

次のようにインスタンス化された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];

Tab Bar Controllerは、指定したView Controllerにデスグリップを持っているため、これによりエラーが発生します。 Tab BarのView Controllerの配列に追加することも、モーダルで表示することもできません。

Appleは、UI要素を特定の方法で扱うことを期待しています。これはおそらく、「これをやりたくないと思っているので、これをしないでください」としてヒューマンインターフェイスガイドラインに埋もれているでしょう。

91
lswank

私は同じ問題を抱えています。終了した直後にView Controllerを表示しようとしています。

[self dismissModalViewControllerAnimated:YES];

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

13
Danil

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

viewController.isBeingPresented

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

誰かを助けるかもしれない。

6
Karthick Ramesh

私は同じ問題を抱えていました。それを解決します。このコードを試すことができます:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];
2
Erhan Demirci

削除するだけ

[tabBarController presentModalViewController:viewController animated:YES];

そして保つ

[self dismissModalViewControllerAnimated:YES];
0
user170317