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
一酥料饼,它需要为酥料饼的使用的一个呈现指定的锚点以下三个特性:
barButtonItem
sourceView
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];
}
你也可以创建一个酥料饼的演示控制器是这样,它可能工作
- (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使用它们作为他们是。一旦您提出UIViewController
,UIPopoverPresentationController
将自动创建,您应该根据自己的需要对其进行修改。
您创建一个myPopoverController
实例,但苹果公司创建了另一个当你present
您contentViewController
右后:
[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;
UIPopoverController从iOS版9弃用起 – Gamerlegend
是啊......编辑答案@ Gamerlegend –