У меня та же проблема, и я перешел на использование UIActivityViewController
. Однако это приводит к тому, что приложения, способные открывать PDF-файлы, больше не отображаются, так что, возможно, это не то, что вам нужно.
Минимальное решение:
Если вы хотите выполнить минимальную работу, вам даже не нужно читать PDF-файл в NSData
, используйте NSURL
в качестве элемента действия, и iOS, похоже, знает, что делать:
- (void)share:(id)sender
{
UIActivityViewController *activity =
[[UIActivityViewController alloc] initWithActivityItems:@[self.URL]
applicationActivities:nil];
if ([activity respondsToSelector:@selector(popoverPresentationController)]) {
activity.popoverPresentationController.barButtonItem = <# BAR BUTTON ITEM #>;
}
[self presentViewController:activity animated:YES completion:NULL];
}
Оригинальный ответ:
Сделайте так, чтобы ваш контроллер представления придерживался протокола UIActivityItemSource
, тогда вы можете сделать:
- (void)share:(id)sender
{
self.pdfData = [NSData dataWithContentsOfURL:self.URL];
UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:@[self] applicationActivities:nil];
if ([activity respondsToSelector:@selector(popoverPresentationController)]) {
activity.popoverPresentationController.barButtonItem = <# BAR BUTTON ITEM #>;
}
[self presentViewController:activity animated:YES completion:NULL];
}
Придерживаться протокола, если у вас есть PDF-файл, относительно просто. Вы, конечно, можете оптимизировать и вернуть NSData меньшего размера и даже изображение для предварительного просмотра, но сделать это минимально:
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
return _pdfData;
}
- (id)activityViewController:(UIActivityViewController *)activityViewController
itemForActivityType:(NSString *)activityType
{
return _pdfData;
}
- (NSString *)activityViewController:(UIActivityViewController *)activityViewController
subjectForActivityType:(NSString *)activityType
{
return self.title;
}
- (NSString *)activityViewController:(UIActivityViewController *)activityViewController
dataTypeIdentifierForActivityType:(NSString *)activityType
{
return @"com.adobe.pdf";
}
person
Pascal
schedule
28.09.2014
self.URL
. Что это? - person rmaddy   schedule 24.09.2014