Проблема UIActivityViewController iOS 7 и iOS 8?

Я создаю приложение для чтения статей для iPad. Я включил функцию совместного использования социальных сетей, что означает, что пользователь может делиться статьями на Facebook и почтой Google. Im использует UIActivityViewController для совместного использования.

При нажатии кнопки UIActivityViewController открывается элемент с кнопкой на панели. Я обновил Xcode 6 Когда я запускаю симулятор, он работает нормально. Но я запускаю на реальном устройстве (iPad) с iOS 7, приложение получает крах при нажатии на элемент кнопки.  это мой код:

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

          }
       }];

    }

Помощь приветствуется!

Ответ 1

Следующая строка - проблема

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

Обратитесь за дополнительной информацией о том, что изменилось для UIActivityViewController в iOS8

Ответ 2

Многие могут утверждать, что проверка существования класса явно лучше, чем проверка номера жестко закодированной версии. UIPopoverPresentationController может быть устаревшим в будущем, или может быть (будущее?) Устройство, которое не поддерживает класс, например iPhone, который никогда не использовался для поддержки UIPopoverController или UISplitViewController..

if (  NSClassFromString(@"UIPopoverPresentationController")   ) {

AVC.popoverPresentationController.sourceView = _webView;


}

Ответ 3

В Swift вы можете использовать '?' вместо этого проверяя версию ОС. AVC.popoverPresentationController?.sourceView = _webView