我正在尝试使用自定义的UIPopoverPresentationController类来显示一个弹出窗口。但是它会崩溃并显示错误(<UIPopoverPresentationController: 0x7a772950>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.
以下是我的按钮点击代码,崩溃发生在此处。
- (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。这里做错了什么吗?感谢您的帮助。
.sourceView
替换为.barButtonItem
,并将其设置为我添加到navigationController.navigationItem
的工具栏按钮项。 - Chris AllinsonsourceRect
,否则弹出窗口将无法显示。 - kbunarjopopOver.permittedArrowDirections = 0;
,这样就没有箭头了。如果不设置,弹出窗口可能无法显示(可能是因为我的源视图是全屏的)。如果我有箭头,我还需要指定.sourceRect
。我给它了view.bounds
,但可能因为它是全屏视图,所以它没有显示弹出窗口。我给了它一个“虚构”的CGRectMake(view.origin.x, view.origin.y, 0, 0);
。 - h3dkandi