UIActivityViewController issue iOS 7 and iOS 8?



我正在为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];
          }
       }];
    }

感谢您的帮助!

下面一行是问题

AVC.popoverPresentationController.sourceView = _webView;

您必须设置iOS8条件,以便popoverPresentationController在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发生了哪些更改的更多信息,请参阅此处

很多人可能会争辩说,显式检查类的存在比检查硬编码的版本号要好。UIPopoverPresentationController可能会在未来某个时候被弃用,或者可能有一个(未来?)设备不支持该类,比如iPhone从未用于支持UIPopoverController或UISplitViewController。。

if (  NSClassFromString(@"UIPopoverPresentationController")   ) {
AVC.popoverPresentationController.sourceView = _webView;

}

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

最新更新