UIPopoverPresentationController应该有一个非零的源视图或barButtonItem设置之前演示文稿发生在iOS 9

问题描述:

我试图显示一个使用自定义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的样本。我在这里做错了什么?感谢您的帮助

可能是下面的代码可以帮助:

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 –

你也可以创建一个酥料饼的演示控制器是这样,它可能工作

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

你继承了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;