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所以这段代码可能无效。