iPhone-应用程序在QLPreviewController中单击菜单操作按钮时崩溃(iOS 4.2)

11
 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个回答

36

需要使用

[NSURL fileURLWithPath:urPath]

9
虽然之前的回答已经给出了正确的技术响应,但我想进一步阐述。 QLPreviewItem 的 API 文档指出 URL 必须是文件类型 URL,NSURL docs 则说明这意味着“使用 file: 方案”。
你还可以从 文档交互编程 指南中了解更多信息,它提到 QuickLook 应该比 UIDocumentInteractionController 更具控制性,因为它让你决定它的呈现方式,但它带来了同样的假设,即你已经在本地拥有一个文件,并且你只是想要一种显示和(使用 QuickLook)通过 AirPrint 打印的方法。
在你的情况下,最合理的做法可能是将文件下载到应用程序的 Caches 目录,然后打开 QL 预览——它已经被预览视图下载了 anyway,所以你也可以抓取它,这样它就可以被打印了。
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"]];

现在,获取您的原始URL并下载其内容,将其保存在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

有没有办法使用[NSURL URLWithString:Url]避免崩溃?

首先将文件下载到本地文件系统中。


应用的目的不是下载文件,而是通过URL预览存在NAS设备中的文件。 - Kapil Gouthaman
1
你无法在未从服务器获取文件的情况下预览它。至少如果你想使用UIDocumentInteractionController的话是不行的。该控制器需要本地文件系统上的文件才能正常工作。 - Matthias Bauch
即使我使用[NSURL URLWithString:Url],预览对我来说也不是问题,我可以查看文件。只是当我点击菜单操作按钮时,应用程序会崩溃...您能否给我任何解决方案,以便应用程序不会崩溃?我是否可以处理菜单操作按钮的点击? - Kapil Gouthaman
目前唯一的解决方案是我将我的iOS降级到4.1,这样菜单操作按钮就不会出现了。 - Kapil Gouthaman

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

0
顺便提一下,您的语句
NSMutableString*Url = [[NSMutableString alloc] initWithFormat:@"http://10.30.24.21/Documents/abc.doc];
有一个打字错误。您错过了一个引号来指示URL字符串的结束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接