UIActivityViewController在iOS 8 iPad上崩溃

我目前正在使用Xcode 6(Beta 6)测试我的应用程序。 UIActivityViewController适用于iPhone设备和模拟器,但与iPad模拟器和设备(iOS 8)一起崩溃,并带有以下日志

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

我为iOS 7和iOS 8使用以下iPhone和iPad代码

NSData *myData = [NSData dataWithContentsOfFile:_filename];
NSArray *activityItems = [NSArray arrayWithObjects:myData, nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:nil applicationActivities:nil];
activityViewController.excludedActivityTypes = @[UIActivityTypeCopyToPasteboard];
[self presentViewController:activityViewController animated:YES completion:nil];

我在其他应用程序中也遇到类似的崩溃。 你能指导我吗? iOS 8中的UIActivityViewController有什么变化? 我检查了但我没有发现任何东西


在iPad上,活动视图控制器将使用新的UIPopoverPresentationController作为弹出窗口显示,它要求您使用以下三个属性之一为弹出窗口的显示指定一个锚点:

  • barButtonItem
  • sourceView
  • sourceRect
  • 为了指定锚点,您将需要获取对UIActivityController的UIPopoverPresentationController的引用,并设置其中一个属性,如下所示:

    if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { 
    // iOS8
     activityViewController.popoverPresentationController.sourceView =
    parentView;
     }
    

    同样的问题来到我的项目,然后我发现解决方案,打开iPad中的UIActivityViewController我们必须使用UIPopoverController

    这里有一个代码可以在iPhone和iPad上使用它们

    //to attach the image and text with sharing 
    UIImage *image=[UIImage imageNamed:@"giraffe.png"];
    NSString *str=@"Image form My app";
    NSArray *postItems=@[str,image];
    
    UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:postItems applicationActivities:nil];
    
    //if iPhone
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self presentViewController:controller animated:YES completion:nil];
    }
    //if iPad
    else {
        // Change Rect to position Popover
        UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:controller];
        [popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/4, 0, 0)inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
    

    为迅速3

    let imageURL: URL = URL(string: product.images[0].fullImageUrlString)!
    let objectsToShare: [AnyObject] = [imageURL as AnyObject]
    let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view
    activityViewController.excludedActivityTypes = [ UIActivityType.airDrop]
    self.present(activityViewController, animated: true, completion: nil)
    

    Swift 2.0中最近遇到了这个确切的问题(原始问题), UIActivityViewController在iPhones上工作正常,但在模拟iPad时导致崩溃。

    我只想在这里添加这个答案的主题,至少在Swift 2.0中,你不需要if语句。 你可以让popoverPresentationController可选的。

    作为一个快速抛开,接受的答案似乎是说你可以只有一个sourceView,只是一个sourceRect,或只是一个barButtonItem,但根据苹果的UIPopoverPresentationController的文档,你需要以下之一:

  • barButtonItem
  • sourceView sourceRect
  • 我正在处理的特定示例如下,其中我创建了一个接收UIView (用于sourceView和sourceRect)和String (UIActivityViewController的唯一activityItem)的函数。

    func presentActivityViewController(sourceView: UIView, activityItem: String ) {
    
        let activityViewController = UIActivityViewController(activityItems: [activityItem], applicationActivities: [])
    
        activityViewController.popoverPresentationController?.sourceView = sourceView
        activityViewController.popoverPresentationController?.sourceRect = sourceView.bounds
    
        self.presentViewController(activityViewController, animated: true, completion: nil)
    }
    

    这段代码适用于iPhone和iPad(甚至tvOS我认为) - 如果设备不支持popoverPresentationController ,则提及它的两行代码基本上被忽略。

    有点不错,只需添加两行代码即可,只需一行即可使用barButtonItem!

    链接地址: http://www.djcxy.com/p/44971.html

    上一篇: UIActivityViewController crashing on iOS 8 iPads

    下一篇: Symbolicate iPhone app crash