web-dev-qa-db-ja.com

ポップオーバーは、ウィンドウのないビューからは表示できません

このエラーの意味:

「Popoversは、ウィンドウのないビューからは表示できません。」
53
a111

ポップオーバーを追加するビューは、すでに「addSubview:」メソッドを使用してウィンドウに追加されている必要があります。

まで待ってみてください

- (void) didMoveToWindow

ビューに対して呼び出され、ポップオーバーをロードします

24
hey68you

私の命を救ったもの:

if (self.view.window != nil)
    [popoverController presentPopoverFromRect:CGRectMake(44, yCoord, 111, 111) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

if条件を追加することで、もうクラッシュしません。 presentPopoverFromRect関数が常に呼び出されるため、私は実際にそれを取得しません。 windowがnilになる状況はありませんが、とにかくトリックを行いました。

編集:このコードはviewDidAppearにあります。それにもかかわらず、ほとんどの場合、presentPopoverFromRectviewDidAppearまたはdidMoveToWindowに移動するだけで十分ですが、私の場合は何らかの理由でif条件が必要でした。

30

この問題が発生しました。

詳細ビューとしてUITabBarControllerがあり、tabBarの3つのナビゲーションコントローラーすべてで、barButtonItemをleftBarButtonItemとして設定しました。

vcChart.navigationItem.leftBarButtonItem = barButtonItem;
vcAnalysis.navigationItem.leftBarButtonItem = barButtonItem;
vcTechnicals.navigationItem.leftBarButtonItem = barButtonItem;

最後に追加されたもののみが有効であり、前の2つはタップすると例外をスローします。

これを修正するために、私は表示可能なView ControllerにleftBarButtonItemのみを設定し、ユーザーがタブを切り替えるたびにbarButtonItemを表示可能なView Controllerに切り替えました。

4
Lewis Anderson

この問題が発生しました。 inView:パラメーターが、IBに接続されていないIBOutletを使用していることが判明しました。したがって、ポップオーバーをゼロで起動しようとしました。それは機能しません。

したがって、有効なビューを使用していることを確認してください。

2
user161814

このエラーに到達する多くの方法があります。基本的に、呼び出しビューがウィンドウに追加されるまで、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がいつ割り当てられるかを理解し、ビューにウィンドウが表示された後にポップオーバーを表示することを確認する方が良いと思います。

2
Joshua Dance

ルイスと同じ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回異なる「メニュー」ボタンをクリックできるのだろうか...さらに調査します。

1
TPoschel

このエラーは、inView:パラメーターが正しくない場合にも発生しました-テストするにはself.viewを試してください

1
John Goodstadt

はい、あなたは正しいですが、それでも親クラスからサブビューを追加できます。したがって、ウィンドウを持つビューから表すことができます。

[popoverController.contentViewController.view addSubview:mySubView];
1
Steve

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を呼び出す必要があるため、これが発生していました。

0
iMeMyself

このような問題がありました。 performSequeでセレクターメソッドを呼び出したカスタマイズされたUIBarButtonアイテムをクリックすると、このメッセージを受け取りました。

問題は、私のセグエがまだUIBarButtonアイテムにアタッチされていたことです。 View Controllerのメインビューに添付されているはずです。これを変更し、正常に動作しました。

追記:UIToolBarに「情報」ボタンを追加したかったため、これはすべて開始されました。これは、システムが提供するリストにはありません。

0
caprijoe

ポップオーバーの表示を要求するビューがあります。このエラーの理由は、このビューをウィンドウのサブビューとして作成していないためです。

 [self.view addSubview:displayPopOverVC];

displayPopOverVCは、popOverが表示されるView Controllerです

0
SumiSadiq

TPoschelによって報告された状況と非常によく似た状況で、OPと同じエラーメッセージがありましたが、詳細ペインにTab Barコントローラーが組み込まれたスプリットビューコントローラーと、この中にナビゲーションコントローラーがありました。バーボタンアイテムは、ナビゲーションバーleftBarButtonItemとして追加されます。

IOS5.0(5.1ではない)でのみ、nilに設定することで、離れるタブバーのバーボタン項目を無効にする必要があるようです。次に、目的のタブのナビゲーションバーにバーボタンを追加します。

そうしないと、自分のコードのデバッグから、バーボタン項目のウィンドウプロパティがnilに設定されたままになり、以前に行った画面でreturningで例外が発生します。 。ナビゲーションアイテムにleftBarButtonItemを設定する副作用として、オフになってフレームを設定します。ただし、ボタンが現在そこに設定されているものと異なる場合を除き、気にしないようです。したがって、タブを離れるときにnilに設定する必要はありますが、技術的には同じボタンが渡されます。

SOが私を許さないことを除いて、TPoschelの答えに賛成です。

0
Rob Glassey

交換しました

[actionSheet showFromBarButtonItem:self.navigationController.navigationItem.leftBarButtonItem animated:YES];

[actionSheet showInView:self.view];
0
Rose Perrone