2011-01-11 262 views
11
When I try to click the menu action button in QLPreviewController the application crashes. 

這是我在委託的方法正在做iPhone-應用程序崩潰的iOS 4.2

- (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:文件路徑])菜單操作按鈕,點擊也不會崩潰,,當我們預覽從服務器文件([ NSURL URLWithString:Url])菜單操作按鈕,點擊崩潰。

我有兩個問題, 1.我們可以禁用菜單操作按鈕嗎? 2.有什麼辦法可以避免使用[NSURL URLWithString:Url]的崩潰?

感謝

回答

2

有什麼辦法避免碰撞 使用[NSURL URLWithString:URL]?

首先將文件下載到本地文件系統。

+0

應用程序的目標是不要下載文件。它只是用於預覽使用URL在NAS設備中存在的文件。 – 2011-01-11 10:09:42

+0

如果不從服務器提取文件,則無法預覽文件。至少不是如果你想使用UIDocumentInteractionController。控制器需要本地文件系統上的文件才能運行。 – 2011-01-11 10:13:58

34

需要使用

[NSURL fileURLWithPath:urPath] 
0

順便說你的發言
NSMutableString*Url = [[NSMutableString alloc] initWithFormat:@"http://10.30.24.21/Documents/abc.doc];有一個錯字,錯誤。你錯過了「來表示URL字符串

8

雖然以前的答案已經給出了正確的技術響應,我想更詳細地說明結束。

QLPreviewItem的API文檔說的URL 必須是文件類型的URL,其中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"]]; 

現在把你的原始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視圖被解除爲止。

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