UIActivityViewController问题iOS 7和iOS 8?

9
我正在为iPad构建一款文章阅读应用程序。我已经集成了社交分享功能,这意味着用户可以在Facebook和谷歌邮件上分享文章。 我使用UIActivityViewController进行分享。
有一个栏目按钮项,当用户点击该项时,UIActivityViewController将打开。我更新了Xcode 6。 当我在模拟器上运行时,它运行良好。但是当我在iOS 7的真实设备(iPad)上运行时,点击栏目按钮项会导致应用程序崩溃。 以下是我的代码:
     - (IBAction)ysshareAction:(id)sender
       {

         NSURL *linkURL = [NSURL URLWithString:_DetailModal1[4]];//article url
         NSMutableAttributedString *stringText = [[NSMutableAttributedString alloc]  initWithString:_DetailModal1[0]];//_DetailModal1[0] contain article title////
        [stringText addAttribute:NSLinkAttributeName value:linkURL range:NSMakeRange(0, stringText.length)];
        NSArray * itemsArray = @[[NSString stringWithFormat:@"%@",_DetailModal1[0]], [NSURL URLWithString:_DetailModal1[4]]];
        NSArray * applicationActivities = nil;
        UIActivityViewController * AVC = [[UIActivityViewController alloc] initWithActivityItems:itemsArray applicationActivities:applicationActivities];
        AVC.popoverPresentationController.sourceView = _webView;
        [self presentViewController:AVC animated:YES completion:nil];
        [AVC setCompletionHandler:^(NSString *act, BOOL done)
        {

        if([act isEqualToString:UIActivityTypeMail]) {
         ServiceMsg = @"Mail sent!";
     } else if([act isEqualToString:UIActivityTypePostToTwitter]) {
         ServiceMsg = @"Article Shared!";
     } else if([act isEqualToString:UIActivityTypePostToFacebook]) {
         ServiceMsg = @"Article Shared!";
     } else if([act isEqualToString:UIActivityTypeMessage]) {
         ServiceMsg = @"SMS sent!";
     } else if([act isEqualToString:UIActivityTypeAddToReadingList]) {
         ServiceMsg = @"Added to Reading List";
     } else if([act isEqualToString:UIActivityTypeCopyToPasteboard]){
         ServiceMsg = @"Copied Link";
     }

     if ( done )
     {
         UIAlertView *Alert = [[UIAlertView alloc] initWithTitle:ServiceMsg message:@"" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil];
         [Alert show];

          }
       }];

    }

非常感谢您的帮助!


请在您的问题中提及崩溃日志。 - Kampai
3个回答

19

以下这行是问题所在

AVC.popoverPresentationController.sourceView = _webView;

为了使用popoverPresentationController,您需要加入 iOS8 的条件判断,因为它仅适用于 iOS 8 及以上版本,所以不能在 iOS 7 上使用。

您可以定义一个宏来检查 iOS8 版本,例如从此处找到。

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

并按以下方式使用它。

     NSURL *linkURL = [NSURL URLWithString:_DetailModal1[4]];//article url
     NSMutableAttributedString *stringText = [[NSMutableAttributedString alloc]  initWithString:_DetailModal1[0]];//_DetailModal1[0] contain article title////
    [stringText addAttribute:NSLinkAttributeName value:linkURL range:NSMakeRange(0, stringText.length)];
    NSArray * itemsArray = @[[NSString stringWithFormat:@"%@",_DetailModal1[0]], [NSURL URLWithString:_DetailModal1[4]]];
    NSArray * applicationActivities = nil;
    UIActivityViewController * AVC = [[UIActivityViewController alloc] initWithActivityItems:itemsArray applicationActivities:applicationActivities];

   if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")){

        AVC.popoverPresentationController.sourceView = _webView;
   }
   [self presentViewController:AVC animated:YES completion:nil];

请参考这里,了解iOS8中UIActivityViewController的变化。


谢谢,你能告诉我isGreaterThaniOS8是什么吗?它显示了一个错误:使用未声明的标识符'isGreaterThaniOS8' - Daljeet
请检查我的已编辑答案,这是一个用于检查iOS版本是否大于或等于8.0的宏。 - Bhumit Mehta
好的,似乎宏中出了些问题,我已经更新了我的答案。 - Bhumit Mehta
我正在寻找的解决方案。谢谢。 - eugen

5

许多人认为明确检查类的存在比检查硬编码版本号更好。UIPopoverPresentationController 可能会在未来某个时间被弃用,或者可能会有一个(未来的?)设备不支持该类,就像 iPhone 以前不支持 UIPopoverController 或 UISplitViewController 一样。

if (  NSClassFromString(@"UIPopoverPresentationController")   ) {

AVC.popoverPresentationController.sourceView = _webView;


}

1
同意检查类的存在,然而,从iOS 4.2开始,检查类是否存在的推荐方法是使用NSObject class方法。在这种情况下:if ([UIPopoverPresentationController class]) {...}优点是您可以获得编译器类型检查。 - mluisbrown

0
在Swift中,您可以使用'?'而不是检查操作系统版本。 AVC.popoverPresentationController?.sourceView = _webView

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