9

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

Существует кнопку пункт бара, когда пользователь нажимает на что UIActivityViewController opens.I обновленного Xcode 6 Когда я бег на тренажере работает нормально, но я бег на реальном устройстве (IPad) с прошивкой 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]; 

      } 
     }]; 

    } 

Помощь ценится!

+0

В вашем вопросе укажите аварийные журналы. – Kampai

ответ

19

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

AVC.popoverPresentationController.sourceView = _webView; 

Вы должны поставить условие iOS8 в порядке popoverPresentationController вводятся для прошивки 8 и позже, так что вы не можете использовать его с прошивкой 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 для получения дополнительной информации о том, что изменилось за UIActivityViewController в iOS8

+0

Спасибо, не могли бы вы рассказать мне, что здесь isGreaterThaniOS8. Он показывает ошибку: использование необъявленного идентификатора 'isGreaterThaniOS8' – Daljeet

+0

Просто мин, позвольте мне отредактировать –

+0

Пожалуйста, проверьте мой отредактированный ответ, его макрос, используемый для проверки, превышает ли версия iOS 8.0 –

5

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

if ( NSClassFromString(@"UIPopoverPresentationController") ) { 

AVC.popoverPresentationController.sourceView = _webView; 


} 
+1

Согласитесь с проверкой существования класса, однако, как и в iOS 4.2, рекомендуемым способом проверки существования класса является использование метода класса NSObject. В этом случае: 'if ([UIPopoverPresentationController class]) {...}' Преимущество заключается в том, что вы получаете проверку типа компилятора. – mluisbrown

0

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

Смежные вопросы