このエラーは何を示していますか:
「ウィンドウのないビューからポップオーバーを表示することはできません。」
私の命を救ったもの:
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 条件が必要でした。viewDidAppear
didMoveToWindow
ポップオーバーを追加するビューは、「addSubview:」メソッドを使用してウィンドウにすでに追加されている必要があります。
まで待ってみてください
- (void) didMoveToWindow
ビューに対して呼び出され、ポップオーバーをロードします
この問題が発生しました。
詳細ビューとしてをUITabBarController
使用し、タブ バーの 3 つのナビゲーション コントローラーすべてで、barButtonItem を leftBarButtonItem として設定しました。
vcChart.navigationItem.leftBarButtonItem = barButtonItem;
vcAnalysis.navigationItem.leftBarButtonItem = barButtonItem;
vcTechnicals.navigationItem.leftBarButtonItem = barButtonItem;
最後に追加されたものだけが有効であり、前の 2 つをタップすると例外がスローされることが判明しました。
それを修正するために、私は可視ビュー コントローラの leftBarButtonItem のみを設定し、ユーザーがタブを切り替えるたびに barButtonItem を可視ビュー コントローラに切り替えました。
この問題が発生しました。inView: パラメータが、IB で接続されていない IBOutlet を使用していたことが判明しました。したがって、nil でポップオーバーを起動しようとしました。それはうまくいきません。
そのため、有効なビューを使用していることを確認してください。
このエラーに到達するには多くの方法があります。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 がいつ割り当てられるかを理解し、ビューにウィンドウが表示された後にポップオーバーを表示するようにした方がよいと思います。
このエラーは、inView:パラメータが正しくない場合にも発生しました-テストするにはself.viewを試してください
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回クリックできるのだろうか...さらに調査します。
TPoschelによって報告された状況と非常によく似た状況で、OPと同じエラーメッセージが表示されました。ただし、詳細ペインにタブバーコントローラーが埋め込まれた分割ビューコントローラーと、この中にナビゲーションコントローラーがありました。バーボタンアイテムは、ナビゲーションバーleftBarButtonItemとして追加されます。
iOS5.0(5.1ではない)でのみ、残しているタブバーのバーボタン項目をnilに設定して無効にする必要があるようです。次に、移動するタブのナビゲーションバーにバーボタンを追加します。
そうしないと、自分のコードのデバッグから、バーボタンアイテムのウィンドウプロパティがnilに設定されたままになり、以前に行った画面に戻ったときに例外が発生します。ナビゲーションアイテムにleftBarButtonItemを設定することの副作用として、それが消えてフレームが設定されると推測しています。しかし、ボタンが現在そこに設定されているものと異なっていない限り、それは気にならないようです。したがって、タブを離れるときは、技術的には渡されるのと同じボタンであっても、nilに設定する必要があります。
SOが私を許可しないことを除いて、私はTPoschelの答えに賛成します。
私は同じ問題を抱えていました.PresentPopOverを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 を呼び出す必要があるため発生していました。
交換しました
[actionSheet showFromBarButtonItem:self.navigationController.navigationItem.leftBarButtonItem animated:YES];
と
[actionSheet showInView:self.view];
このような問題がありました。UIBarButton
did performSeque でセレクター メソッドを呼び出したカスタマイズされた項目をクリックすると、このメッセージが表示されました。
問題は、私のセグエがまだUIBarButton
アイテムに付いていたことです。ビューコントローラーのメインビューにアタッチされているはずです。これを変更して、うまくいきました。
PS、これはすべて、「情報」ボタンを に追加したかったために開始されましたUIToolBar
。これは、システムが提供するリストにはありません。