Quicklook/QLPreviewController показывает пустую страницу вместо pdf на ios 8, но отлично работает на iOS7

Я пытаюсь просмотреть файл 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];
}

Ответ 2

Кажется, что ошибка при размещении QLPreviewController внутри UINavigationController. Он просто отображается как черный вид, даже если документ загружен.

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:previewController];
[self presentViewController:navController animated:YES completion:nil];

Решение состоит в том, чтобы не использовать навигационный контроллер. QLPreviewController все равно переопределяет навигационную панель.

[self presentViewController:previewController animated:YES completion:nil];

Ответ 3

Здесь, вероятно, есть две вещи.

Для тех, кто реализует QLPreviewController в UINavigationController, там, вероятно, проблема.

Для тех, у кого есть проблема без UINavigationController, читайте дальше.

В iOS 8.0 был изменен путь к файлу данных. Поэтому, если вы используете более старый путь пакета для доступа к своим ресурсам, у вас может возникнуть проблема.

Мы исследовали это, и получается:

  • что вам нужно обратить пристальное внимание на то, как вы получаете полный путь к каталогу документов.
  • что QLPreviewController НЕ МОЖЕТ отображать файл в подпапке этого каталога Документов, если вы его не создали.

Например, наша проблема заключалась в том, что наш PDF файл был открыт из внешнего приложения с использованием традиционного "Open In".

Это привело к тому, что файл был скопирован в папку "Входящие" в каталоге "Документы" приложения.

Файл отображается правильно на симуляторе, независимо от того, какой QLPreviewController встроен в UINavigationController или нет.

Файл НЕ отображается корректно на реальном устройстве iOS.

Перед отправкой URL-адреса файла в QLPReviewController мы скопировали файл в корень каталога Documents, передав этот новый URL-адрес QLPreviewController. А потом бинго, это сработало.

Итак, чтобы остановить эту проблему, убедитесь, что вы скопировали ресурс в каталоге, который у вас есть. Пока кто-нибудь не сможет объяснить, как играть с правами в папке "Входящие" (вероятно, общий).

Ответ 4

Используйте этот код, если вам отчаянно нужно использовать 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];

Ответ 5

Недавно я снова столкнулся с пустой страницей, и я нашел причину того, что сделал что-то вроде

previewController.dataSource = [[MyDataSource alloc] initWithSomething];

Так как QLPreviewController содержит свой источник данных как слабую переменную, источник данных сразу же исчезает.

Поддерживается сильная ссылка на dataSource.

Ответ 6

Хорошо работает со мной на 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, не вставляйте его в свой навигационный контроллер

Ответ 7

Для iOS 9.2: В Monotouch.ios,

использовать

var url = NSUrl.FromFilename(NSBundle.MainBundle.PathForResource ("pdf.pdf", null)); 

вместо

var url = NSUrl.FromFilename("pdf.pdf");

Он будет работать для всех файлов. (jpg, png, pdf и т.д.)

Ответ 8

У меня была та же проблема, и мне нужно было вызвать reloadData() после того, как я установил dataSource в новое значение.

Ответ 9

У меня возникла проблема (и до сих пор) с представлением документов из пакета (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-адрес источнику данных.