Ответ 1
Это действительно известная проблема в iOS 8 Beta 5.
См. URL в разделе QuickLook https://developer.apple.com/library/prerelease/ios/releasenotes/General/RN-iOSSDK-8.0/
Я пытаюсь просмотреть файл pdf в QLPreviewController и использовать приведенный ниже код. Он отлично работает на iOS7 и для других типов файлов (JPG/PNG) на iOS8, но когда я пытаюсь открыть pdf, он показывает вместо пустой страницы вместо iOS8. Странно, что он по-прежнему показывает название pdf в заголовке.
код:
QLPreviewController *previewer = [[QLPreviewController alloc] init];
previewer.dataSource = self;
previewer.currentPreviewItemIndex = 0;
[self presentViewController:previewer animated:NO completion:nil];
И методы QLPreviewControllerDataSource:
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller {
return 1;
}
- (id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index {
return [NSURL fileURLWithPath:self.pdfUrl];
}
Это действительно известная проблема в iOS 8 Beta 5.
См. URL в разделе QuickLook https://developer.apple.com/library/prerelease/ios/releasenotes/General/RN-iOSSDK-8.0/
Кажется, что ошибка при размещении QLPreviewController внутри UINavigationController. Он просто отображается как черный вид, даже если документ загружен.
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:previewController];
[self presentViewController:navController animated:YES completion:nil];
Решение состоит в том, чтобы не использовать навигационный контроллер. QLPreviewController все равно переопределяет навигационную панель.
[self presentViewController:previewController animated:YES completion:nil];
Здесь, вероятно, есть две вещи.
Для тех, кто реализует QLPreviewController в UINavigationController, там, вероятно, проблема.
Для тех, у кого есть проблема без UINavigationController, читайте дальше.
В iOS 8.0 был изменен путь к файлу данных. Поэтому, если вы используете более старый путь пакета для доступа к своим ресурсам, у вас может возникнуть проблема.
Мы исследовали это, и получается:
Например, наша проблема заключалась в том, что наш PDF файл был открыт из внешнего приложения с использованием традиционного "Open In".
Это привело к тому, что файл был скопирован в папку "Входящие" в каталоге "Документы" приложения.
Файл отображается правильно на симуляторе, независимо от того, какой QLPreviewController встроен в UINavigationController или нет.
Файл НЕ отображается корректно на реальном устройстве iOS.
Перед отправкой URL-адреса файла в QLPReviewController мы скопировали файл в корень каталога Documents, передав этот новый URL-адрес QLPreviewController. А потом бинго, это сработало.
Итак, чтобы остановить эту проблему, убедитесь, что вы скопировали ресурс в каталоге, который у вас есть. Пока кто-нибудь не сможет объяснить, как играть с правами в папке "Входящие" (вероятно, общий).
Используйте этот код, если вам отчаянно нужно использовать QLPreviewController, встроенный в UINavigationController:
#import <Quicklook/QLPreviewController.h>
...
QLPreviewController *pc = [[QLPreviewController alloc] init];
pc.delegate = self;
pc.dataSource = self;
UINavigationController *nc = [[UINavigationController alloc] init];
nc.view.backgroundColor = [UIColor whiteColor];
nc.navigationBarHidden = YES;
[self presentViewController:nc animated:YES completion:nil];
[nc pushViewController:pc animated:NO];
Недавно я снова столкнулся с пустой страницей, и я нашел причину того, что сделал что-то вроде
previewController.dataSource = [[MyDataSource alloc] initWithSomething];
Так как QLPreviewController
содержит свой источник данных как слабую переменную, источник данных сразу же исчезает.
Поддерживается сильная ссылка на dataSource.
Хорошо работает со мной на iOS8.1
Убедитесь, что файл doc загружен в правильный путь к файлу
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [paths objectAtIndex:0];
urlString = [urlString stringByReplacingOccurrencesOfString:@"/" withString:@""];
filePath = [cachePath stringByAppendingPathComponent:urlString];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath];
if (fileExists == NO) {
NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:mainPadfLink]];
[pdfData writeToFile:filePath atomically:YES];
}
и загрузите его в свой QLPreviewControl
- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index
{
return [NSURL fileURLWithPath:filePath];
}
И убедитесь, что вы открыли QLPreviewControl с помощью currentViewController, не вставляйте его в свой навигационный контроллер
Для iOS 9.2: В Monotouch.ios,
использовать
var url = NSUrl.FromFilename(NSBundle.MainBundle.PathForResource ("pdf.pdf", null));
вместо
var url = NSUrl.FromFilename("pdf.pdf");
Он будет работать для всех файлов. (jpg, png, pdf и т.д.)
У меня была та же проблема, и мне нужно было вызвать reloadData()
после того, как я установил dataSource
в новое значение.
У меня возникла проблема (и до сих пор) с представлением документов из пакета (xCode 9.2, iOS 11). Он отображает только изображения. Для других документов (pdf, key, rtf, pages, docx, txt...) отображается только имя, а не контент. Я представляю контроллер по модулю, и источник данных реализован следующим образом:
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
return 1
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
let url = Bundle.main.url(forResource: "test", withExtension: "pdf")!
if QLPreviewController.canPreview(url as NSURL) {
print("This file can be previewed.")
} else {
print("This file can not be previewed.")
}
return url as NSURL
}
Конечно, он показывает, что файл CAN можно просмотреть, но он не просматривает его. В настоящее время я решаю это, копируя файл в каталог документов и передавая этот URL-адрес источнику данных.