1

UINavigationController の navigationItem から起動されたポップオーバーを閉じるのに問題があります。UINavigationController によって挿入されたナビゲーション アイテムは、UIPopoverController の却下をトリガーしないようです。通常、ポップオーバーの外側をタップすると、ポップオーバーは消えます。ただし、ナビゲーション項目をタップしても、ポップオーバーは消えません。さらに悪いことに、ポップオーバーをトリガーするボタンをタップすると、ポップオーバーの 2 番目のインスタンスが表示されます。

これはすべて、ストーリーボードを使用して行われます。- UIBarButtonItem を navigationItem に入れます (左または右は、ナビゲーション スタックの初期ビューには関係ありません)。- 別のビューを定義し、セグエを UIBarButtonItem からこのビューにドラッグします。- セグエをポップオーバーに設定します。

ポップオーバーが開いたら、navigationItem をタップしても閉じることができません。これが「設計どおりに機能する」とは信じられないので、何かを逃したのではないかと思います。

私の目標はプログラミングをできるだけ少なくすることですが (それがストーリーボードの目的ですよね?)、回避策を考えました。ナビゲーションアイテムのタップを検出したときのポップオーバー。残念ながら、navigationItem は UIVIew ではないようで、addGestureRecognizer: メソッドがありません...

編集: UITapGesturerecognizer を self.navigationController.navigationBar に追加することは可能ですが、navigationBar の UIBarButtonItems に到達するためのタップを防ぎます。はい、期待できました。

助けてくれてありがとう、のび

4

4 に答える 4

2

ストーリーボードのポップオーバーの完全な説明は次のとおりです。ポップオーバーに表示されるコントローラーの名前が であると仮定すると、次のようにMyPopupControllerします。

  1. MyPopupControllerstyle を使用して、メイン シーンからシーンへのセグエを定義しますPopover
  2. プロパティを追加するMyPopupController.h

    @property (weak, nonatomic) UIPopoverController *popover;
    
  3. でプロパティを合成するMyPopupController.m

    @synthesize popover = _popover
    
  4. メイン シーン コントローラーのメソッドで、プロパティprepareForSegue:sender:を設定します。popover

    UIStoryboardPopoverSegue *ps = (UIStoryboardPopoverSegue *)segue;
    MyPopupController *dc = ps.destinationViewController;
    dc.popover = ps.popoverController;
    
  5. viewWillAppear:メソッドにMyPopupController、次のコードを追加します (忘れないでください[super viewWillAppear])。

    self.popover.passThroughViews = nil;
    

これで完了です。

基本的なアイデアを提供してくれた Robert に感謝しますpresentPopoverFromBarButtonItem。ストーリーボードを使用するときに は使用されないため、正しい場所を見つける必要がありました。(5) を入れてviewDidLoadも機能しないことに注意してください。

楽しくコーディングしましょう!

于 2012-12-19T10:20:39.527 に答える
1

https://stackoverflow.com/a/12874772/1455770

バーボタンアイテムからポップオーバーを表示した後、ポップオーバーの「passthroughViews」はナビゲーションバーを含むように設定されているため、タップは登録されません。ポップオーバーを提示した直後に、パススルービューをnilに設定します。すなわち。

self.myPopoverController presentPopoverFromBarButtonItem:myBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
self.myPopoverController.passthroughViews = nil;// at this point the myPopoverController has had its pass through views set to include the whole nav bar. remove it.
于 2012-12-03T04:30:48.087 に答える
0

これよりも優れた解決策があるかもしれませんが、ポップオーバーが開いているときは常に UITapGestureRecognizer を navBar に追加しないのはなぜですか? ボタンをタップしてポップオーバーを開いたら、TapGestureRecogniser を navBar に追加します。ポップオーバーを閉じたら、navBar から TapGestureRecogniser を削除します。

于 2012-07-20T11:42:43.027 に答える