Xcode をバージョン 4 から 5 に、したがって iOS 6 から iOS 7 にアップグレードした後、次のエラーが発生します。
'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];
これが多くの人に役立つことを願っています:)
私は以前に使用したことがあります
- (void)showFromTabBar:(UITabBar *)view;
私のコントローラーの1つで同様の問題が発生しました(さまざまなコントローラーからのアクションシートの表示を処理するユーティリティメソッドがあります)。
hidesBottomBarWhenPushed = YES;
iOS 7 では、これは tabBar で window を nil に設定しているように見え、前述のエラーが発生します。私の回避策は、タブバーのウィンドウプロパティを確認することです.nil呼び出しの場合
if (nil == tabBar.window) {
[actionSheet showInView:self.window];
}
else {
[actionSheet showFromTabBar:tabBar];
}