Xcodeをバージョン4から5に、したがってiOS6からiOS7にアップグレードした後、次のエラーが発生します。
'NSInvalidArgumentException'、理由: 'ビューがウィンドウにないため、シートを表示できません
この行で:
[actionSheet showInView:self.view];
私は文字通りこれとまったく同じ問題を抱えていましたが、残念ながら、問題の根本的な原因が何であるかはまだわかりません。しかし、あなたは私の現在の解決策を以下に見つけるでしょう。問題の原因となる根本的な問題が発生した場合は、お知らせします。
UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
if ([window.subviews containsObject:self.view]) {
[emailSheet showInView:self.view];
} else {
[emailSheet showInView:window];
}
同じ問題が発生しました。私のコードでは、明らかにその理由は、viewWillAppear:
にアクションシートを表示したかったためです。コードをviewDidAppear:
に移動した後、エラーはなくなりました。
問題の根本的な原因はわかりませんが、自分に合った解決策を見つけました。代わりに self.view
、次の行を配置します:
[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]
例えば:
[actionSheet showInView:[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]];
同じ問題が[actionSheet showInView:self.view];
で、[actionSheet showInView:[UIApplication sharedApplication].keyWindow];
で解決しました。
おそらく、問題は Appleドキュメント の段落に関連しています:
サブクラス化に関する注意:
UIActionSheetはサブクラス化されるようには設計されておらず、その階層にビューを追加する必要もありません。 UIActionSheet APIによって提供されるよりも多くのカスタマイズを使用してシートを提示する必要がある場合は、独自のシートを作成し、
presentViewController:animated:completion:
を使用してモーダルに提示できます。
同じ問題が発生しました。私の場合、self.viewが別のviewControllerを表示しているときに、self.viewにActionSheetを表示しようとしたときに発生しました。
これはクラッシュです:「ビューがウィンドウにないため、シートを表示できません」
問題の例:
[modalViewController dismissModalViewControllerAnimated:YES];
[actionSheet showInView:self.view];
ModalViewControllerが閉じてから、ActionSheetが表示されるのを待つことで、問題を解決しました。
解決:
[modalViewController dismissModalViewControllerAnimated:YES];
[actionSheet performSelector:@selector(showInView:) withObject:self.view afterDelay:0.6];
これが多くの人々に役立つことを願っています:)
ツールバーにも同様の問題があり、セレクターshowInView
に渡されたビューにnilではないウィンドウがあるかどうかを常に確認することをお勧めします。例えば:
if (self.view.window)
[actionSheet showInView:self.view];
このようにして、迷惑な例外を回避できます。次に、アプリケーションレイアウトに従って、有効なビューを検索してアクションシートを表示する必要があります。アプリにタブバーまたはツールバーがある場合は、使用することをお勧めします
- (void)showFromToolbar:(UIToolbar *)view;
- (void)showFromTabBar:(UITabBar *)view;
私の場合、これは、スタックにプッシュされたばかりのViewControllerがアラートシートを表示することを決定したときに発生します。しかし、どうやらビューコントローラは、プッシュされた直後にそれを行う準備がまだ完全にはできていません。私が使う [actionSheet showInView:self.parentViewController.view];
の代わりに [actionSheet showInView:self.view];
。
以前に使用したことがあります
- (void)showFromTabBar:(UITabBar *)view;
コントローラーの1つ(さまざまなコントローラーからのアクションシートの表示を処理するユーティリティメソッドがあります)で同様の問題が発生しました。
hidesBottomBarWhenPushed = YES;
IOS 7では、これにより、tabBarでウィンドウがnilに設定されているように見え、前述のエラーが発生します。私の回避策は、tabBarのwindowプロパティを確認し、nil呼び出しの場合は
if (nil == tabBar.window) {
[actionSheet showInView:self.window];
}
else {
[actionSheet showFromTabBar:tabBar];
}
IOS 7では、showInView:
に送信されるビューはビュー階層の一部である必要があります。一部のビューのサブビューとして追加する必要があります。showInView:
がnilであるかどうかを確認することで、view.window
で一部のビューを使用できるかどうかを確認できます。view.superview
もnil以外である必要があります