点击QLPreviewController ios 4.2中的菜单操作按钮,iPhone-应用程序崩溃

时间:2011-01-11 09:58:23

标签: iphone

 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]来避免崩溃?

由于

5 个答案:

答案 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];