UIDocumentInteractionController需要很长时间才能显示选项。

11

我已经使用了UIDocumentInteractionController来分享文件,但在iOS 8 beta 5中在25秒后才会打开菜单选项,在iOS 7.1中正常工作。

我已验证下面的日志:

Errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo=0x79bd5ef0 {NSLocalizedDescription=query cancelled}
2014-08-27 15:02:05.634 Localwire[82067:1364165] Unknown activity items supplied: (
        {
        "com.microsoft.excel.xls" = <d0cf11e0 a1b11ae1 00000000 00000000 00000000 00000000 3e000300 feff0900 06000000 00000000 00000000 10000000 01000000 00000000 00100000 cb070000 01000000 feffffff 00000000 00000000 62000000 e3000000 64010000 e5010000 66020000 e7020000 68030000 e9030000 6a040000 eb040000 6c050000 ed050000 6e060000 ef060000 70070000 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff

我不确定问题是什么。


我在使用UIActivityViewController来呈现共享菜单时遇到了同样的问题。你找到任何解决方案了吗? - mrdziuban
我在使用UIDocumentInteractionController时,遇到了一些奇异的视频格式、pdf和doc文件的同样问题。在我的情况下,我收到了一个内存警告,并且到目前为止我还没有找到解决方案。很遗憾听到UIActivityViewController也有相同的问题。 - Calin Chitu
1
@CalinChitu user2163024,我使用了UIActivityViewController代替它,没有出现任何问题。这个bug在iOS 8 GM中仍然存在,所以我选择使用UIActivityViewController来解决这个问题。 - Prashanth
@Prashanth 谢谢,我会尝试一下。 - Calin Chitu
5个回答

3

UIActivityViewController在iOS 8中非常快。但是,您不能在其他第三方应用程序(如Instagram、Vintiqu等)中打开图片。

此外,在iOS 8中,presentOpenInMenuFromRect比presentOptionsMenuFromRect快得多(iOS 8.0.2也是如此)。 但是,presentOpenInMenuFromRect不会显示共享操作。

我想在共享视图上提供“保存图片、指定联系人、复制、打印”等选项给用户。 因此,我的当前解决方法就像下面这样,:(

    if( SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
        [self.udic presentOpenInMenuFromRect:CGRectMake(self.view.frame.size.width/2 - 49/2, self.view.frame.size.height-49, 49, 49)  inView:self.view animated:YES];
    } else {
        [self.udic presentOptionsMenuFromRect:CGRectMake(self.view.frame.size.width/2 - 49/2, self.view.frame.size.height-49, 49, 49)  inView:self.view animated:YES];
    }

你的回答存在问题,presentOpenInMenuFromRect方法无法显示邮件、AirDrop和iMessage等选项。 - Prashanth

2
我使用了UIActivityViewController,没有出现任何问题。这个bug在iOS 8正式版中仍然存在。
因此我要使用UIActivityViewController修复它。
我使用了TYOpenInAppActivity来在UIActivityViewController中显示第三方应用程序。
NSURL *URL = [NSURL fileURLWithPath:filePath];
TTOpenInAppActivity *openInAppActivity = [[TTOpenInAppActivity alloc] initWithView:self.view andBarButtonItem:barButton];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[URL] applicationActivities:@[openInAppActivity]];
    // Create pop up
    self.activityPopoverController = [[UIPopoverController alloc] initWithContentViewController:activityViewController];
    // Store reference to superview (UIPopoverController) to allow dismissal
    openInAppActivity.superViewController = self.activityPopoverController;
    // Show UIActivityViewController in popup
    [self.activityPopoverController presentPopoverFromRect:((UIButton *)sender).frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

您可以在下面的链接中找到TTOpenInAppActivity控制器。

https://github.com/honkmaster/TTOpenInAppActivity


1
你尝试使用UIActivityViewController打开PDF文件了吗? - Kate Geld
我尝试了。同时将自定义页面渲染器传递给了activityItems。虽然已经正确处理,但这会带来“未知的活动项”错误。 - Stas
1
@KateGeld UIActivityController的问题在于它无法显示所有第三方应用程序。我对其进行了一些修改,以支持第三方应用程序...我已编辑了我的答案,请检查。 - Prashanth

1

目前我的解决方法是使用presentOpenInMenuFromRect代替presentOptionsMenuFromRect,这样会显示更少的选项,但至少不会导致内存问题。在iOS 8 beta 5中,快速查看选项似乎也存在问题,pdf快速查看也无法正常工作,此外还存在电影内存问题。


它对我没用……相反,UIAcitivityController起作用了…… - Prashanth
presentOpenInMenuFromRect的问题在于它不显示AirDrop、邮件和iMessage选项...而我需要这些选项,所以我使用了UIActivityViewController,并在其中使用TTOpenInAppActivity作为活动。 - Prashanth

1
简单解决方案:将 UIDocumentInteractionController 作为视图控制器变量(属性或实例变量)保留,并在 viewDidLoad 中进行初始化(在我的情况下,我没有使用任何参数进行初始化)。如果要打开的文件URL是动态更改的,则只需在呈现之前更改 UIDocumentInteractionController.URL 属性即可。

0
我在使用UIActivityViewController时遇到了这个问题,当传入一个字典的NSData项来表示PNG图像时。
我能够通过在activityViewControllerPlaceholderItem:方法中将NSData对象转换为UIImage实例来加速操作表的呈现。
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController {
    NSMutableDictionary *itemPlaceholders = [NSMutableDictionary dictionary];

   [self.items enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSData *obj, BOOL *stop) {
       UIImage *placeholderImage = [UIImage imageWithData:obj scale:.5];
       [itemPlaceholders setObject:placeholderImage forKey:key];
   }];

   return itemPlaceholders;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接