【问题标题】:UIActivityViewController issue iOS 7 and iOS 8?UIActivityViewController 问题 iOS 7 和 iOS 8?
【发布时间】:2014-11-19 23:09:28
【问题描述】:

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

          }
       }];

    }

感谢您的帮助!

【问题讨论】:

  • 请在您的问题中提及崩溃日志。

标签: ios objective-c ipad uipopovercontroller uiactivityviewcontroller


【解决方案1】:

以下是问题

AVC.popoverPresentationController.sourceView = _webView;

您必须按顺序排列 iOS8 条件 popoverPresentationController 是为 iOS 8 及更高版本引入的,因此您不能在 iOS 7 中使用它

为了检查 iOS8,您可以定义一个类似于 here 的宏

#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];

请参阅this 了解有关 iOS8 中 UIActivityViewController 的更改的更多信息

【讨论】:

  • 谢谢,你能告诉我什么是GreaterThaniOS8。它显示一个错误:使用未声明的标识符'isGreaterThaniOS8'
  • 请检查我编辑的答案,它是一个用于检查iOS版本是否大于或等于8.0的宏
  • 好吧,宏好像有问题,我已经更新了答案。
  • 我正在寻找的解决方案。谢谢。
【解决方案2】:

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

if (  NSClassFromString(@"UIPopoverPresentationController")   ) {

AVC.popoverPresentationController.sourceView = _webView;


}

【讨论】:

  • 同意检查一个类的存在,然而,从iOS 4.2开始,检查一个类的存在的推荐方法是使用NSObject class方法。在这种情况下:if ([UIPopoverPresentationController class]) {...} 优点是您可以进行编译器类型检查。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2015-01-14
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多