UIDocumentInteractionController停止工作iOS 8

我有一个PDF文件保存在文档目录中。 文件的路径存储在NSString属性“self.URL”中。 这是我展示活动项目的代码:

-(void)presentDocumentInteractionController{ self.docController = [UIDocumentInteractionController interactionControllerWithURL:self.URL]; self.docController.delegate = self; [_docController setUTI:@"com.adobe.pdf"]; [_docController presentOptionsMenuFromBarButtonItem:self.activityBarButton animated:YES]; } 

在iOS 8之前,这段代码运行良好。 向用户呈现了诸如打印,复印和电子邮件之类的项目列表以供选择。 升级到iOS 8 / XCode 6后,我收到此运行时错误(它不会导致应用程序崩溃):

 Unknown activity items supplied: ( "" ) 

我怎么解决这个问题?

我有同样的问题,并已切换到使用UIActivityViewController 。 然而,这使得能够打开PDF的应用程序不再显示,所以也许这不是你想要的。

最小解决方案:

如果你想做最少的工作,你甚至不需要将你的PDF读入NSData ,使用NSURL作为活动项目,iOS似乎知道该怎么做:

 - (void)share:(id)sender { UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:@[self.URL] applicationActivities:nil]; if ([activity respondsToSelector:@selector(popoverPresentationController)]) { activity.popoverPresentationController.barButtonItem = <# BAR BUTTON ITEM #>; } [self presentViewController:activity animated:YES completion:NULL]; } 

原答案:

使您的视图控制器遵循UIActivityItemSource协议,然后您可以执行以下操作:

 - (void)share:(id)sender { self.pdfData = [NSData dataWithContentsOfURL:self.URL]; UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:@[self] applicationActivities:nil]; if ([activity respondsToSelector:@selector(popoverPresentationController)]) { activity.popoverPresentationController.barButtonItem = <# BAR BUTTON ITEM #>; } [self presentViewController:activity animated:YES completion:NULL]; } 

如果您有PDF文件,则遵守协议相对简单。 您当然可以优化并返回较小的NSData甚至是预览图像,但最低限度地执行此操作:

 - (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { return _pdfData; } - (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { return _pdfData; } - (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType { return self.title; } - (NSString *)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(NSString *)activityType { return @"com.adobe.pdf"; } 

使用

 - (BOOL)presentOpenInMenuFromBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated; 

代替

 - (BOOL)presentOptionsMenuFromBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated; 

这解决了我的问题:

ObjC:

 dispatch_async(dispatch_get_main_queue(), ^() { [_docController presentOptionsMenuFromRect:button.bounds inView:button animated:YES]; }); 

迅速:

 if let docController = UIDocumentInteractionController(URL: url) { dispatch_async(dispatch_get_main_queue()) { docController.presentPreviewAnimated(true) } } else { // handle nil docController } 

我不使用swift所以这段代码可能无效。