2

我試圖顯示一個使用自定義UIPopoverPresentationController類彈出。但它崩潰的錯誤(<UIPopoverPresentationController: 0x7a772950>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.下面是我的按鈕點擊代碼發生崩潰。UIPopoverPresentationController應該有一個非零的源視圖或barButtonItem設置之前演示文稿發生在iOS 9

- (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]; 
} 

下面是我的自定義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; 
} 

我沒有barbutton但我設置sourceView的樣本。我在這裏做錯了什麼?感謝您的幫助

回答

0

可能是下面的代碼可以幫助:

iPad視圖控制器將顯示爲使用新UIPopoverPresentationController一酥料餅,它需要爲酥料餅的使用的一個呈現指定的錨點以下三個特性:

  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

+0

是啊......編輯答案@ Gamerlegend –

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使用它們作爲他們是。一旦您提出UIViewControllerUIPopoverPresentationController將自動創建,您應該根據自己的需要對其進行修改。

您創建一個myPopoverController實例,但蘋果公司創建了另一個當你presentcontentViewController右後:

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

這個新UIPopoverPresentationController缺乏sourceView並拋出異常。

嘗試下面的代碼來代替:

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; 
相關問題