QLPreviewController не работает в iOS 6

В iOS 6 QLPreviewController больше не загружает PDF из URL-адреса. Он отлично работает в iOS 5. Я реализовал методы QLPreviewControllerDataSource, как описано здесь.

#pragma mark - QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller {
    return 1;
}

- (id <QLPreviewItem>) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger) index;
{
    NSURL *fileURL = [NSURL URLWithString:@"http://www.bliley.net/XTAL/PDF_Instructions/Test_File.pdf"];
    return fileURL;
}

Это отлично работает в iOS 5, однако в iOS 6 выходы консоли:

Couldn't issue file extension for path: /XTAL/PDF_Instructions/Test_File.pdf

Ответ 1

Вы пытались использовать файлURLWithPath вместо URLWithString? У меня были другие проблемы, которые были исправлены при этом.

Также не уверен, что QLPreviewController будет обрабатывать удаленные URL-адреса. Если нет, вы можете загрузить файл, а затем отобразить его.

Ответ 2

Я загрузил файл с удаленного URL-адреса и сохранил его локально, затем я показываю PDF с помощью QLPreviewController. В iOS 6 работает его.

Сначала я сохранил файл с удаленного URL, используя следующий код:

    NSString *local_location;

    NSString *path = [[NSBundle mainBundle] pathForResource:@"sampleData" ofType:@"plist"];
        path = NSTemporaryDirectory();
    local_location= [path stringByAppendingPathComponent:[NSString stringWithFormat:@"My_Invoice.pdf"]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString: remoteurl]];
        [request setDownloadDestinationPath:local_location];
        [request startSynchronous];

Для показа Pdf:

QLPreviewController* preview = [[QLPreviewController alloc] init];
        preview.dataSource = self;
        [self presentModalViewController:preview animated:YES];

Методы делегирования QLPreviewController:

- (NSInteger) numberOfPreviewItemsInPreviewController: (QLPreviewController *) controller
{
    return 1;
}

- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index
{

    return [NSURL fileURLWithPath:local_location];


}

Ответ 3

У меня есть аналогичная проблема, и похоже, это может быть связано с более строгим применением URL-адреса типа файла QLPreviewItem

@property (readonly) NSURL *previewItemURL;
Discussion
This property is used by a Quick Look preview controller to get an item’s URL. In typical use, you would implement a getter method in your preview item class to provide this value.

The value of this property must be a file-type URL.

If the item is not available for preview, this property’s getter method should return nil. In this case, the Quick Look preview controller displays a "loading" view.

Availability
Available in iOS 4.0 and later.
Declared In
QLPreviewItem.h

ОБНОВЛЕНИЕ: я открыл ошибку с Apple, занимающейся этой проблемой для iOS 6, и кажется, что они вызвали ее как ошибку, поэтому могут предложить исправление в ближайшем будущем. Ошибка, которую я открыл, связана с использованием пользовательских NSURLProtocols для предварительного просмотра, но может применяться и к другим аспектам.

Ссылка на класс

Ответ 4

Но обратите внимание, что QLPreviewController ожидает URL-адрес локального ресурса

Сначала вам нужно сначала загрузить и сохранить файл PDF, а затем создать правильный URL-адрес файла для локального файла.