UIActivityViewController在带有sourceView或barButtonItem的iPad上崩溃

ami*_*jaj 8 objective-c uiwebview ipad ios uiactivityviewcontroller

我遇到了大多数人在试图UIActivityViewController在iPad上呈现时所面临的情况; 它崩溃了:

Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc4f2d87d00>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

- (void)shareLeaflet
{
    NSString *forwardedString = [[NSString alloc] initWithFormat:@"Check out this leaflet\n\n %@ \n\nself.theURLToShare];
    UIActivityViewController *activityViewController = nil;

    if (IDIOM == IPAD)
    {
        NSLog(@"iPad");
        activityViewController.popoverPresentationController.sourceView = self.view;
//        activityViewController.popoverPresentationController.sourceRect = self.frame;
        [self presentViewController:activityViewController
                           animated:YES
                         completion:nil];

    }
    else
    {
        NSLog(@"iPhone");
        activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObjects:forwardedString, nil] applicationActivities:nil];
        [self presentViewController:activityViewController animated:YES completion:nil];


    }
Run Code Online (Sandbox Code Playgroud)

在我viewDidLoad,我有:

UIBarButtonItem *composeButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self                                    action:@selector(shareLeaflet)];

    self.navigationItem.rightBarButtonItem = composeButton;
}
Run Code Online (Sandbox Code Playgroud)

这个视图是一个UIPageViewController展示一些图像的视图,当用户点击分享按钮时,我期待弹出iOS 8样式的共享表.这正是iPhone上发生的事情,但在iPad上,它仍在继续崩溃.这导致我发现Stack Overflow,但没有任何问题(由于未被捕获的异常原因显示UIPopOverPresentationController,iOS崩溃:终止应用程序崩溃:UIPopoverPresentationController应该有一个非零的sourceView,UIWebViewTerminating应用程序,因为UIPopoverPresentationController,ios8 iPad uiwebview在显示时崩溃popover当用户点击下拉列表HTML选择标记等)为我工作.

我已经尝试了所有的解决方案,我只是得到了这个所需要的.

这就是我想要实现的目标:

在此输入图像描述 对此的任何想法都会非常感激.

Jor*_*ies 16

你没有在iPad上初始化activityViewController,所以它总是为零.

尝试:

- (void)shareLeaflet
{
    NSString *forwardedString = [[NSString alloc] initWithFormat:@"Check out this leaflet\n\n %@ \n\nself.theURLToShare];
    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObjects:forwardedString, nil] applicationActivities:nil];

    if (IDIOM == IPAD)
    {
        NSLog(@"iPad");
        activityViewController.popoverPresentationController.sourceView = self.view;
//        activityViewController.popoverPresentationController.sourceRect = self.frame;
        [self presentViewController:activityViewController
                           animated:YES
                         completion:nil];
    }
    else
    {
        NSLog(@"iPhone");
        [self presentViewController:activityViewController 
                          animated:YES 
                        completion:nil];
    }
Run Code Online (Sandbox Code Playgroud)

然后像在图像中一样显示:( _shareBarButton是您希望弹出框显示的UIBarButtonItem)

- (void)shareLeaflet
    {
        NSString *forwardedString = [[NSString alloc] initWithFormat:@"Check out this leaflet\n\n %@ \n\nself.theURLToShare];
        UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObjects:forwardedString, nil] applicationActivities:nil];

        if (IDIOM == IPAD)
        {
            NSLog(@"iPad");
            activityViewController.popoverPresentationController.sourceView = self.view;
    //        activityViewController.popoverPresentationController.sourceRect = self.frame;

           _popover = [[UIPopoverController alloc] initWithContentViewController:activityViewController];
           _popover.delegate = self;
           [_popover presentPopoverFromBarButtonItem:_shareBarButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
        }
        else
        {
            NSLog(@"iPhone");
            [self presentViewController:activityViewController 
                              animated:YES 
                            completion:nil];
        }
Run Code Online (Sandbox Code Playgroud)