ios - UIActivityViewController 在使用 sourceView 或 barButtonItem 的 iPad 上崩溃

标签 ios objective-c ipad uiwebview uiactivityviewcontroller

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

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

这是我的代码:

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


    }

在我的 viewDidLoad 中,我有:

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

    self.navigationItem.rightBarButtonItem = composeButton;
}

此 View 是一个 UIPageViewController,它展示了一些图像,当用户点击共享按钮时,我希望弹出 iOS 8 样式的共享表。这正是 iPhone 上发生的情况,但在 iPad 上,它继续崩溃。这让我想到了 Stack Overflow,但没有一个问题( crash on showing UIPopOverPresentationControlleriOS Crash: Terminating app due to uncaught exception reason: UIPopoverPresentationController should have a non-nil sourceViewUIWebViewTerminating app due to UIPopoverPresentationControllerios8 iPad uiwebview crashes while displaying popover when user taps drop down list HTML select tag 等)对我有用。

我已经尝试了其中的所有解决方案,并且完全明白了它的要求。

这就是我要实现的目标:

enter image description here 对此有任何想法将不胜感激。

最佳答案

您没有在 iPad 上初始化 activityViewController,因此它将始终为 nil。

尝试:

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

然后像图像中那样显示它:(_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];
        }

关于ios - UIActivityViewController 在使用 sourceView 或 barButtonItem 的 iPad 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33942902/

相关文章:

objective-c - 将文件从临时目录复制到资源文件夹

ios - iOS 上带有德语变音符号的 FacebookDisplayName

ipad - 未调用 UISplitViewController 委托(delegate)方法

iphone - UITextView的每一行中的字符数是否相同?

objective-c - iPad 应用程序 - 生成文本文件

ios - 无限循环试图从 IB 中的 xib 创建自定义 View

ios - 有没有办法创建 SKSpriteNode 的 CGPath 匹配轮廓?

Objective-C:从自身释放对象

objective-c - 为什么这段代码不绘制白色文本?

ios - 将触摸和手势从 UIScrollview 转发到 View