IPhone-приложение вылетает при нажатии кнопки действия меню в QLPreviewController ios 4.2

 When I try to click the menu action button in QLPreviewController the application crashes.

Это то, что я делаю в методе делегата

- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)index
{

    NSMutableString*Url = [[NSMutableString alloc] initWithFormat:@"http://10.30.24.21/Documents/abc.doc];

    NSURL *fileURL;
    fileURL = [NSURL URLWithString:Url];// the url of the file which is present in NAS device
    [Url release];
    return fileURL;
}

Это отчет о сбое

2011-01-11 12:21:36.717 iLink[5548:207] *** Assertion failure in -[UIDocumentInteractionController setURL:], /SourceCache/UIKit_Sim/UIKit-1447.6.4/UIDocumentInteractionController.m:1060
2011-01-11 12:21:36.720 iLink[5548:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIDocumentInteractionController: invalid scheme https.  Only the file scheme is supported.'

Когда я пытаюсь просмотреть файл, находящийся в локальном меню, кнопка "Действие" не вылетает.

там я буду использовать

 NSURL *fileURL;
    fileURL = [NSURL fileURLWithPath:filePath];// filePath is local file path.

Я понял, что когда мы просматриваем локальные файлы ([NSURL fileURLWithPath: filePath]), нажатие кнопки действия меню не сбрасывается, когда мы просматриваем файлы с сервера ([NSURL URLWithString: Url]), нажатие кнопки действия меню вызывает сбои.

У меня есть два вопроса: 1. Можем ли мы отключить кнопку действия меню? 2. Есть ли способ избежать сбоя, используя [NSURL URLWithString: Url]?

Спасибо

Ответ 1

Необходимо использовать

[NSURL fileURLWithPath:urPath]

Ответ 2

В то время как предыдущие ответы дали правильный технический ответ, я хотел подробнее остановиться.

В документах API для QLPreviewItem указано, что URL-адрес должен быть URL-адресом типа файла, который документами NSURL say означает, что "использует схему file:".

Вы также можете прочитать немного больше из руководства Взаимодействие с документами", в котором упоминается, что QuickLook должен давать вам больше контроля, чем UIDocumentInteractionController, позволяя вам решить, каким образом он представлен, но он приносит с собой те же предположения, что у вас уже есть файл локально, и вы просто хотите способ для его отображения и (с помощью QuickLook) распечатать его с помощью AirPrint.

В вашем случае может потребоваться загрузить файл в каталог приложения Caches, а затем открыть предварительный просмотр QL - он уже загружается в режиме предварительного просмотра, так что вы могли бы также захватить его, чтобы он также может быть напечатан.

NSArray *paths  = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
// Here you'll _probably_ want to use a filename that got the correct extension...but YMMV
NSURL *cacheURL = [NSURL fileURLWithPath:[[paths objectAtIndex:0] stringByAppendingPathComponent: @"current.pdf"]];

Теперь возьмите исходный URL-адрес и загрузите содержимое и сохраните его в cacheURL. Если вы используете ASIHTTPRequest, это выглядит так:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:originalURL];
[request setDownloadDestinationPath:[cacheURL path]];
// Yup. You could optimize here if needed...
[request startSynchronous];

И затем вы используете URL-адрес файла в вашем представлении QuickLook...

- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)index {
    // Assuming you've saved this somewhere, etc...
    return self.cacheURL;
}

В этом случае каждый новый PDF, который вы просматриваете со своего NAS, перезаписывает предыдущий (то же имя, тот же каталог), поэтому вы ограничиваете использование вашего диска. Очевидно, существует множество способов решения этой проблемы, поэтому выберите тот, который вам подходит. Ключ, однако, заключается в том, чтобы загрузить файл локально и сохранить его по крайней мере до тех пор, пока не будет отклонено представление QL.

Ответ 3

Есть ли способ избежать краха используя [NSURL URLWithString: Url]?

Сначала загрузите файл в локальную файловую систему.

Ответ 4

Кстати ваше выражение
 NSMutableString*Url = [[NSMutableString alloc] initWithFormat:@"http://10.30.24.21/Documents/abc.doc]; имеет опечатку-ошибку. Вы пропустили ", чтобы указать конец строки URL

Ответ 5

Мне удалось показать файлы PDF с использованием схемы HTTP. Приложение вылетает, когда пользователь нажимает кнопку печати. Поэтому мне нужен был способ показать PDF через HTTP и в качестве штрафа, необходимого для отключения кнопки печати. Отключить кнопки в подклассе в viewDidAppear Вот мой код

@interface PreviewController : QLPreviewController
@end

@implementation PreviewController
-(void) viewDidAppear:(BOOL)animated {
    self.navigationItem.rightBarButtonItem = nil;
}
@end

и используется как код:

// use the new class
QLPreviewController *previewController = [[PreviewController alloc] init];
previewController.delegate = self;
previewController.dataSource = self;
[self.navigationController pushViewController:previewController animated:FALSE];