2

カスタムUIPopoverPresentationControllerクラスを使用してポップアップを表示しようとしています。しかし、それはエラー(<UIPopoverPresentationController: 0x7a772950>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.でクラッシュする以下はクラッシュが発生する私のボタンのクリックコードです。以下はプレゼンテーションがiOS 9で発生する前に、UIPopoverPresentationControllerにはnil以外のsourceViewまたはbarButtonItemが設定されている必要があります。

- (IBAction)showPopup:(UIButton *)sender { 
ViewController *contentViewController = [[ViewController alloc] init]; 

    contentViewController.preferredContentSize = CGSizeMake(200, 200); 
    contentViewController.modalPresentationStyle = UIModalPresentationPopover; 
    myPopoverController *popOver = [[myPopoverController alloc]initWithPresentedViewController:contentViewController presentingViewController:self andTintColor:[UIColor lightGrayColor]]; 

    popOver.delegate = self; 
    popOver.permittedArrowDirections = UIPopoverArrowDirectionUp; 
    popOver.sourceRect = sender.frame; 
    popOver.sourceView = self.view; 
    [self presentViewController:contentViewController animated: YES completion: nil]; 
} 

私はbarbuttonを持っていないが、私はsourceViewを設定しています私のカスタムUIPopoverPresentationControllerが

myPopoverController.h file 

@interface myPopoverController : UIPopoverPresentationController 

@property (readonly) UIColor *tintColor; 


-(instancetype)initWithPresentedViewController:(UIViewController *)presentedViewController presentingViewController:(UIViewController *)presentingViewController andTintColor:(UIColor *)aTintColor; 

@end 


myPopoverController.m file 

//Some code for UIPopoverBackgroundView 

-(instancetype)initWithPresentedViewController:(UIViewController *)presentedViewController presentingViewController:(UIViewController *)presentingViewController 
{ 

    self = [self initWithPresentedViewController:presentedViewController presentingViewController:presentingViewController andTintColor: [UIColor redColor]]; 

    return self; 
} 


-(instancetype)initWithPresentedViewController:(UIViewController *)presentedViewController presentingViewController:(UIViewController *)presentingViewController andTintColor:(UIColor *)aTintColor 
{ 

    self = [super initWithPresentedViewController:presentedViewController presentingViewController:presentingViewController]; 

    if (!self) { 
     return nil; 
    } 

    [super setPopoverBackgroundViewClass: [myPopoverControllerBackgroundView class]]; 
    tintColor = aTintColor; 


    return self; 
} 

どのように見えるかのサンプルです。私はここで何か間違っていますか?ビューコントローラは、新しいUIPopoverPresentationControllerを使用してポップオーバーとして表示されます

iPadでは、それはのいずれかを使用してポップオーバーのプレゼンテーションのためのアンカーポイントを指定する必要があります。助けることができる

答えて

0

はコードを下回るかもしれませ、あなたの助けに感謝3次のプロパティ:

  1. barButtonItem
  2. sourceView
  3. sourceRect

次のように実行します。

//for iPhone 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 

    [self presentViewController:controller animated:YES completion:nil]; 

} 
//for iPad 
else { 
    // Change Rect as required 
    ViewController *contentViewController = [[ViewController alloc] init]; 

    contentViewController.preferredContentSize = CGSizeMake(200, 200); 
    contentViewController.modalPresentationStyle = UIModalPresentationPopover; 
    [self presentViewController:contentViewController animated:YES completion:nil]; 
} 
+0

がUIPopoverControllerがiOSの9からGamerlegend @以降 – Gamerlegend

+0

うん...編集した答えを推奨されていません –

5

をあなたはまた、このようなポップオーバーのプレゼンテーションコントローラを作成することができ、それが

- (IBAction)showPopup:(UIButton *)sender { 

ViewController *contentViewController = [[ViewController alloc] init]; 
    contentViewController.preferredContentSize = CGSizeMake(200, 200); 
    contentViewController.modalPresentationStyle = UIModalPresentationPopover; 

UIPopoverPresentationController *popoverpresentationController = contentViewController.popoverPresentationController; 
    popoverpresentationController.delegate = self; 
    popoverpresentationController.permittedArrowDirections = UIPopoverArrowDirectionUp; 
    popoverpresentationController.sourceRect = sender.bounds; 
    popoverpresentationController.sourceView = sender; 
    [self presentViewController:contentViewController animated: YES completion: nil]; 
} 
2

あなたにそれらを使用するUIPopoverPresentationControllerが、アップルrecommendsをサブクラス化しているが動作する可能性があり彼らです。 UIViewControllerを提示すると、UIPopoverPresentationControllerが自動的に作成され、必要に応じて変更する必要があります。

あなたが myPopoverControllerインスタンスを作成しますが、Appleは別のものを作成するときに、あなた presentあなた contentViewController右後:

[self presentViewController:contentViewController animated: YES completion: nil]; 

この新しいUIPopoverPresentationControllersourceViewを欠いており、例外がスローされます。

代わりに以下のコードを試してみてください。

ViewController *contentViewController = [[ViewController alloc] init]; 

// Present the view controller using the popover style. 
contentViewController.modalPresentationStyle = UIModalPresentationPopover; 
[self presentViewController:contentViewController 
        animated:YES 
       completion:nil]; 

// Get the popover presentation controller and configure it. 
UIPopoverPresentationController *presentationController =[contentViewController popoverPresentationController]; 
presentationController.permittedArrowDirections = UIPopoverArrowDirectionUp; 
presentationController.sourceView = sender.frame; 
presentationController.sourceRect = self.view; 
関連する問題