53

このエラーは何を示していますか:

「ウィンドウのないビューからポップオーバーを表示することはできません。」
4

13 に答える 13

30

私の命を救ったもの:

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

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

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

于 2011-08-26T10:01:25.903 に答える
24

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

まで待ってみてください

- (void) didMoveToWindow

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

于 2010-08-01T07:58:58.217 に答える
4

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

詳細ビューとしてをUITabBarController使用し、タブ バーの 3 つのナビゲーション コントローラーすべてで、barButtonItem を leftBarButtonItem として設定しました。

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

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

それを修正するために、私は可視ビュー コントローラの leftBarButtonItem のみを設定し、ユーザーがタブを切り替えるたびに barButtonItem を可視ビュー コントローラに切り替えました。

于 2011-03-03T20:32:21.180 に答える
2

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

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

于 2010-08-15T20:26:47.860 に答える
2

このエラーに到達するには多くの方法があります。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 がいつ割り当てられるかを理解し、ビューにウィンドウが表示された後にポップオーバーを表示するようにした方がよいと思います。

于 2013-06-04T17:33:44.853 に答える
1

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

于 2012-02-06T12:53:52.550 に答える
1

UIBarButtonItemルイスと同じように複数のナビゲーションアイテムに同じものを割り当てると、同じエラーメッセージが表示されました。を使用していたので、私の例は少し複雑でしたUISplitViewController

私のRootViewController中には、テーブル内の複数のセクションを実行するための配列の配列があります。ユーザーがテーブルの行をクリックするたびに、新しい「詳細」ビューコントローラーがsplitViewControllerの右側のペインに配置されます。を設定する前にleftBarButtonItem = nil、[メニュー]ボタンを3〜4回クリックすると、a111と同じエラーでセグメンテーション違反が発生します。以前の詳細ビューコントローラーを実際に取得し、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回クリックできるのだろうか...さらに調査します。

于 2011-06-29T15:57:25.727 に答える
0

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

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

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

SOが私を許可しないことを除いて、私はTPoschelの答えに賛成します。

于 2012-06-04T13:50:25.970 に答える
0

私は同じ問題を抱えていました.PresentPopOverviewDidAppearに追加した後、これは解決されました

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

于 2013-01-22T09:19:23.797 に答える
0

交換しました

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

[actionSheet showInView:self.view];
于 2013-08-18T19:30:00.793 に答える
0

このような問題がありました。UIBarButtondid performSeque でセレクター メソッドを呼び出したカスタマイズされた項目をクリックすると、このメッセージが表示されました。

問題は、私のセグエがまだUIBarButtonアイテムに付いていたことです。ビューコントローラーのメインビューにアタッチされているはずです。これを変更して、うまくいきました。

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

于 2012-07-04T00:25:10.167 に答える