Проблема 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