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]来避免崩溃?
由于
答案 0 :(得分:35)
需要使用
[NSURL fileURLWithPath:urPath]
答案 1 :(得分:8)
虽然之前的答案给出了正确的技术响应,但我想详细说明。
QLPreviewItem的API文档说网址必须是文件类型的网址,NSURL docs表示“使用file:
方案”
您还可以从Document Interaction Progamming指南中了解更多内容,其中提到QuickLook应该通过让您决定呈现方式来为您提供比UIDocumentInteractionController更多的控制权,但它带来了它与您已经在本地获得文件的相同假设,您只需要一种方法来显示它,并且(使用QuickLook)使用AirPrint打印它。
在您的情况下,最好将文件下载到应用程序的Caches
目录,然后打开QL预览 - 它已经被预览视图无论如何下载了,所以你不妨抓住它,这样它也可以打印出来。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
// Here you'll _probably_ want to use a filename that's got the correct extension...but YMMV
NSURL *cacheURL = [NSURL fileURLWithPath:[[paths objectAtIndex:0] stringByAppendingPathComponent: @"current.pdf"]];
现在获取原始网址并下载内容并将其保存在cacheURL
。如果您使用ASIHTTPRequest
,它看起来像这样:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:originalURL];
[request setDownloadDestinationPath:[cacheURL path]];
// Yup. You could optimize here if needed...
[request startSynchronous];
然后在QuickLook视图中使用文件URL ...
- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)index {
// Assuming you've saved this somewhere, etc...
return self.cacheURL;
}
在这种情况下,您从NAS 查看的每个新PDF都会覆盖上一个(相同名称,相同目录),因此您可以限制磁盘使用量。显然,有很多方法可以解决这个问题,所以选择一个适合你的方法。但关键是要在本地下载文件并至少保留它,直到QL视图被解除为止。
答案 2 :(得分:2)
有没有办法避免崩溃 使用[NSURL URLWithString:Url]?
首先将文件下载到本地文件系统。
答案 3 :(得分:0)
顺便提一下你的陈述
NSMutableString*Url = [[NSMutableString alloc] initWithFormat:@"http://10.30.24.21/Documents/abc.doc];
有错字错误。你错过了“表示url字符串的结尾
答案 4 :(得分:0)
我能够使用HTTP方案显示PDF文件。当用户按下打印按钮时,应用程序崩溃。因此,我需要一种方法来通过HTTP显示PDF并禁用打印按钮所需的惩罚。在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];