このエラーの意味:
「Popoversは、ウィンドウのないビューからは表示できません。」
ポップオーバーを追加するビューは、すでに「addSubview:」メソッドを使用してウィンドウに追加されている必要があります。
まで待ってみてください
- (void) didMoveToWindow
ビューに対して呼び出され、ポップオーバーをロードします
私の命を救ったもの:
if (self.view.window != nil)
[popoverController presentPopoverFromRect:CGRectMake(44, yCoord, 111, 111) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
if条件を追加することで、もうクラッシュしません。 presentPopoverFromRect
関数が常に呼び出されるため、私は実際にそれを取得しません。 windowがnilになる状況はありませんが、とにかくトリックを行いました。
編集:このコードはviewDidAppear
にあります。それにもかかわらず、ほとんどの場合、presentPopoverFromRect
をviewDidAppear
またはdidMoveToWindow
に移動するだけで十分ですが、私の場合は何らかの理由でif条件が必要でした。
この問題が発生しました。
詳細ビューとしてUITabBarController
があり、tabBarの3つのナビゲーションコントローラーすべてで、barButtonItemをleftBarButtonItemとして設定しました。
vcChart.navigationItem.leftBarButtonItem = barButtonItem;
vcAnalysis.navigationItem.leftBarButtonItem = barButtonItem;
vcTechnicals.navigationItem.leftBarButtonItem = barButtonItem;
最後に追加されたもののみが有効であり、前の2つはタップすると例外をスローします。
これを修正するために、私は表示可能なView ControllerにleftBarButtonItemのみを設定し、ユーザーがタブを切り替えるたびにbarButtonItemを表示可能なView Controllerに切り替えました。
この問題が発生しました。 inView:パラメーターが、IBに接続されていないIBOutletを使用していることが判明しました。したがって、ポップオーバーをゼロで起動しようとしました。それは機能しません。
したがって、有効なビューを使用していることを確認してください。
このエラーに到達する多くの方法があります。基本的に、呼び出しビューがウィンドウに追加されるまで、presentPopover
コマンドを呼び出すのを待つ必要があります。私はこのようにしました。
- (void)viewDidAppear:(BOOL)animated
{
[self methodThatDisplaysPopOver];
}
presentPopoverFromRect
呼び出しはmethodThatDisplaysPopOver
関数内にあります。
MobiMaciekが提案するように、すべてのpresentPopover呼び出しをこれで保護できます。
if (self.view.window != nil)
[popoverController presentPopoverFromRect:CGRectMake(10, 10, 100, 100) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
ただし、self.view.windowがいつ割り当てられるかを理解し、ビューにウィンドウが表示された後にポップオーバーを表示することを確認する方が良いと思います。
ルイスと同じUIBarButtonItem
を複数のナビゲーションアイテムに割り当てると、同じエラーメッセージが表示されました。 UISplitViewController
を使用していたため、私の例は少し複雑でした。
RootViewController
には、テーブル内の複数のセクションを実現するための配列の配列があります。ユーザーがテーブル内の行をクリックするたびに、splitViewControllerの右ペインに新しい「詳細」View Controllerが配置されます。 leftBarButtonItem = nil
を設定する前に、a111と同じエラーで「メニュー」ボタンを3〜4回クリックすると、セグメンテーション違反が発生しました。コードを更新して、以前の詳細ビューコントローラーを実際に取得し、leftBarButtonItemアイテムをnilに設定しました。
allData
は、オブジェクトとして複数の他のNSMutableArrayを含む私のNSMutableArrayです。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Retrieve the new detail view controller
UIViewController *detailViewController = [[self.allData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
// Add the detail view controller to a navigation controller and set the bar style
UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
detailNavigationController.navigationBar.barStyle = [[NSUserDefaults standardUserDefaults] integerForKey:@"UIBarStyle"];
// Retrieve previous detail view controller and remove the leftBarButtonItem
UINavigationController *previousDetailNavigationController = [splitViewController.viewControllers objectAtIndex:1];
UIViewController *previousDetailViewController = [[previousDetailNavigationController viewControllers] lastObject];
previousDetailViewController.navigationItem.leftBarButtonItem = nil;
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailNavigationController, nil];
splitViewController.viewControllers = viewControllers;
[detailNavigationController release];
[viewControllers release];
// Dismiss the popover if it's present.
if (popoverController != nil) {
[popoverController dismissPopoverAnimated:YES];
}
// This sets the left bar to nil when in landscape and equal to "Menu" when in portrait.
// We need to remove rootPopoverButtonItem from the previous viewController...
detailViewController.navigationItem.leftBarButtonItem = rootPopoverButtonItem;
}
エラーメッセージは最初は少しだまされていましたが、上記の答えが役に立ちました。なぜセグメンテーション違反の前に最大3〜4回異なる「メニュー」ボタンをクリックできるのだろうか...さらに調査します。
このエラーは、inView:パラメーターが正しくない場合にも発生しました-テストするにはself.viewを試してください
はい、あなたは正しいですが、それでも親クラスからサブビューを追加できます。したがって、ウィンドウを持つビューから表すことができます。
[popoverController.contentViewController.view addSubview:mySubView];
PresentPopOver in viewDidAppearを追加した後、同じ問題が発生しました
- (void) viewDidAppear:(BOOL)animated{
CGRect popoverRect = screenBounds;
popoverRect.size.width = MIN(popoverRect.size.width,0) ;
popoverRect.Origin.x = screenBounds.Origin.x;
[popoverController
presentPopoverFromRect:popoverRect
inView:self.view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
@ hey68YouとMobiMaciekが示唆するように、viewDidLoadの後にinView:self.viewを呼び出す必要があるため、これが発生していました。
このような問題がありました。 performSequeでセレクターメソッドを呼び出したカスタマイズされたUIBarButton
アイテムをクリックすると、このメッセージを受け取りました。
問題は、私のセグエがまだUIBarButton
アイテムにアタッチされていたことです。 View Controllerのメインビューに添付されているはずです。これを変更し、正常に動作しました。
追記:UIToolBar
に「情報」ボタンを追加したかったため、これはすべて開始されました。これは、システムが提供するリストにはありません。
ポップオーバーの表示を要求するビューがあります。このエラーの理由は、このビューをウィンドウのサブビューとして作成していないためです。
[self.view addSubview:displayPopOverVC];
displayPopOverVCは、popOverが表示されるView Controllerです
TPoschelによって報告された状況と非常によく似た状況で、OPと同じエラーメッセージがありましたが、詳細ペインにTab Barコントローラーが組み込まれたスプリットビューコントローラーと、この中にナビゲーションコントローラーがありました。バーボタンアイテムは、ナビゲーションバーleftBarButtonItemとして追加されます。
IOS5.0(5.1ではない)でのみ、nilに設定することで、離れるタブバーのバーボタン項目を無効にする必要があるようです。次に、目的のタブのナビゲーションバーにバーボタンを追加します。
そうしないと、自分のコードのデバッグから、バーボタン項目のウィンドウプロパティがnilに設定されたままになり、以前に行った画面でreturningで例外が発生します。 。ナビゲーションアイテムにleftBarButtonItemを設定する副作用として、オフになってフレームを設定します。ただし、ボタンが現在そこに設定されているものと異なる場合を除き、気にしないようです。したがって、タブを離れるときにnilに設定する必要はありますが、技術的には同じボタンが渡されます。
SOが私を許さないことを除いて、TPoschelの答えに賛成です。
交換しました
[actionSheet showFromBarButtonItem:self.navigationController.navigationItem.leftBarButtonItem animated:YES];
と
[actionSheet showInView:self.view];