首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在iOS 9上进行演示之前,UIPopoverPresentationController应设置非nil sourceView或barButtonItem

在iOS 9上进行演示之前,UIPopoverPresentationController应设置非nil sourceView或barButtonItem
EN

Stack Overflow用户
提问于 2017-03-21 15:01:00
回答 6查看 20.6K关注 0票数 20

我正在尝试使用自定义的UIPopoverPresentationController类显示弹出窗口。但是它崩溃了,错误是下面的(<UIPopoverPresentationController: 0x7a772950>) should have a non-nil sourceView or barButtonItem set before the presentation occurs. is my button click code is my button click code where the crash。

代码语言:javascript
复制
- (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的样例

代码语言:javascript
复制
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;
}

我没有工具栏按钮,但我正在设置sourceView。我是不是做错了什么?感谢您的帮助

EN

回答 6

Stack Overflow用户

发布于 2017-04-07 22:24:06

你也可以像这样创建一个popover展示控制器,它可能会工作

代码语言:javascript
复制
- (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];
}
票数 11
EN

Stack Overflow用户

发布于 2017-07-27 17:37:36

你对UIPopoverPresentationController进行了子类化,但苹果recommends却使用了原样。一旦您提供了一个UIViewController,系统将自动创建一个UIPopoverPresentationController,并且您应该根据需要对其进行修改。

你创建了一个myPopoverController实例,但当你present你的contentViewController之后,苹果又创建了另一个实例:

代码语言:javascript
复制
[self presentViewController:contentViewController animated: YES completion: nil];

这个新的UIPopoverPresentationController缺少sourceView并抛出一个异常。

请尝试下面的代码:

代码语言:javascript
复制
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 = self.view;
presentationController.sourceRect = sender.frame;
票数 4
EN

Stack Overflow用户

发布于 2021-02-04 04:52:56

如果sourceView为null,则只需添加验证

代码语言:javascript
复制
UIActivityViewController * avc = [[UIActivityViewController alloc] initWithActivityItems:shareItems applicationActivities:nil];
if(avc.popoverPresentationController){
    avc.popoverPresentationController.sourceView = self.view;
}
[self presentViewController:avc animated:YES completion:nil];

See this post

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42920340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档