2017-11-10 3 views
2

iPhoneとiPadの両方に1つのストーリーボードを使用して、Xcode(バージョン9.1 9B55)マスター - ディテールテンプレートを使用してプロジェクトを試行しています。iPhone上でUIPopoverPresentationControllerDelegateを呼び出す

サイズクラスが適切なときにポップオーバーを表示する組み込みのpopover segue、またはサイズクラスがコンパクトな場合のモーダルビューコントローラ(iPhoneはポートレート)を使用します。

私が見つけたのは、iPadでうまく動作するということですが、iPhoneで実行すると、予想通りにポップオーバーの外側に触れることができません。

iPadの場合、popoverPresentationControllerDidDismissPopoverが呼び出され、すべて正常です。

iPhoneの場合、popoverPresentationControllerDidDismissPopoverは呼び出されず、ポップオーバーを解除することはできません。

は、私がこれをしなかった、再現するには、次の

  • は、App

  • 新新しいマスター・ディテールの作成 - ファイル。ストーリーボードではMyPopoverViewController

と呼ばれるココアタッチクラス、:

は、新しいビューコントローラ、MyPopoverViewControllerに変更したクラスを作成します。

MasterViewControllerでは、バーボタンアイテム "Popover"を追加します。コントロールからこれをMyPopoverViewControllerにドラッグします。 segue Kindを「Popoverとして提示する」に設定します。識別子を "thePopover"に設定します。 MasterViewController.hで

は、UIPopoverPresentationControllerDelegateを追加します。MasterViewController.mで

@interface MasterViewController : UITableViewController <UIPopoverPresentationControllerDelegate> 

:のviewDidLoadで

#import "MyPopoverViewController.h" 

を、 "追加ボタン" を作成する2行をコメントアウト。 prepareForSegueで

- (void) prepareForPopoverPresentation:(UIPopoverPresentationController *)popoverPresentationController { 
    NSLog(@"MVC prepareForPopoverPresentation"); 
} 

- (void) popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController { 
    NSLog(@"MVC popoverPresentationControllerDidDismissPopover"); 

} 

- (BOOL) popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController { 
    NSLog(@"MVC popoverPresentationControllerShouldDismissPopover"); 
    return TRUE; 

} 

は、私もこれを試してみましたが、それがないすべては、ポートレートモードでの力のポップオーバー(私はしたくないもの)である:

} else if ([[segue identifier] isEqualToString:@"thePopover"]) { 
    NSLog(@"MVC prepareForSegue thePopover"); 
    MyPopoverViewController *myPopoverController = segue.destinationViewController; 
    myPopoverController.popoverPresentationController.delegate = self; 
} 

3つのUIPopoverPresentationControllerDelegateのデリゲートメソッドを追加します。 ;ポップオーバーのデリゲートの呼び出しの欠如を変更しないと、私たちは、ポップオーバーを却下することはできません:

-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { 
return UIModalPresentationNone; 
} 

私は私がここに欠けているシンプルなものがある願っています。

https://github.com/johnstewart/MasterDetailPopoverTestProject

は、どのように私は、iPhoneにもポップオーバーの外に触れることによってpopoversを却下することができます:私は、上述した内容を正確にしている、ここではサンプルプロジェクトをアップロードしていますか?

+1

ポップオーバーの外に触れるとPopOverが解除されます。あなたのデモは完全に機能しています。私はxcode 9.1とiphone 8 plus simulatorでテストしました。デリゲートメソッドが呼び出され、スムーズにその中に書かれたものが印刷されます –

+0

Jitendra - 確認のために再ダウンロードしました。私はiPhone 8 +シミュレータでプロジェクトを実行しました。その後、横に回転させ、「Popover」ボタンをタッチしました。ポップオーバーの代わりにモーダルダイアログが表示され、ダイアログの外に触れることは却下されず、デリゲートメソッドも呼び出されません。 –

答えて

1

あなたの質問が正しく理解された場合、問題はiPhone 8 Plusでランドスケープモードで表示されます。

この状況では、提示されたポップオーバーは実際にはではなく、通常の提示されたビューであるです。視覚的には、画面のボトムから現れるシートのように見えます。このようなビューを閉じるには、これを行うために独自のボタンを追加する必要があります。

あなたは本当のポップオーバーを表示したい場合は、実装する必要があります。

adaptivePresentationStyleForPresentationController:traitCollection: 

UIModalPresentationNoneを返すように。追加パラメータtraitcollection:に注意してください。 UIAdaptivePresentationControllerDelegateは、2つの類似の方法を含む。あなたのプロジェクトではすでにメソッドを実装しています:

adaptivePresentationStyleForPresentationController: 

これを前の方法に変更してください。すべてがうまくいくはずです。

+0

これはそれです! 私はadaptivePresentationStyleForPresentationController:traitCollection: をMasterViewControllerに実装しました。コードは期待通りに機能します! デバイスがコンパクトまたは通常の幅を持っているかどうかテストを追加しました。(私の元の意図 - 通常の水平方向の場合のみポップオーバーを行い、コンパクトの場合は全画面のモーダルです)、そのコードをテストプロジェクトに戻します。他の人の参照。 ありがとう、mschmidt!奨励金を贈る –

関連する問題