开发者

iPhone- application crashes on click of menu action button in QLPreviewController ios 4.2

 When I try to click the menu ac开发者_运维知识库tion button in QLPreviewController the application crashes.

This is what I'm doing in delegate method

- (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;
}

This is the crash report

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.'

When I try to preview file present locally menu action button click is not crashing.

there I'll be using

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

I understood that when we preview local files ([NSURL fileURLWithPath:filePath]) menu action button click is not crashing ,, when we preview files from server ([NSURL URLWithString:Url]) menu action button click crashes.

I have two questions, 1. Can we disable the menu action button? 2. Is there any way to avoid the crash using [NSURL URLWithString:Url]?

Thanks


Need to use

[NSURL fileURLWithPath:urPath]


While previous answers have given the correct technical response, I wanted to elaborate more.

The API docs for QLPreviewItem say that the URL must be a file-type URL, which the NSURL docs say means "uses the file: scheme".

You can also read a bit more from the Document Interaction Progamming guide which mentions that the QuickLook is supposed to give you more control than a UIDocumentInteractionController by letting you decide the way it's presented, but it brings with it the same assumptions that you've already got a file locally and you simply want a way to display it and (with QuickLook) print it with AirPrint.

In your case, it may make most sense to download the file to the app's Caches directory, then open the QL preview -- it's already being downloaded by the preview view anyway, so you might as well grab it so that it can be printed too.

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

Now take your original URL and download the contents and save them at cacheURL. If you use ASIHTTPRequest, it looks like this:

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

And then you use the file URL in your QuickLook view...

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

In this scenario, each new PDF that you look at from your NAS overwrites the previous one (same name, same directory), so you limit your disk usage. Obviously, there's lots of ways to handle that problem, so choose one that's appropriate for you. The key, though, is to download the file locally and keep it around at least until the QL view's been dismissed.


Is there any way to avoid the crash using [NSURL URLWithString:Url]?

Download the file to your local filesystem first.


By the way your statement
NSMutableString*Url = [[NSMutableString alloc] initWithFormat:@"http://10.30.24.21/Documents/abc.doc];has a typo-error. You missed a " to indicate the end of the url string


I was able to show PDF files using HTTP scheme. The App crashes when a user presses the print button. So I needed a way just to show the PDF over HTTP and as a penalty needed to disable the print button. Disable buttons in a subclass in viewDidAppear Here is my code

@interface PreviewController : QLPreviewController
@end

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

and used as code:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜