2012-03-07 82 views
2

因此,我意識到使用UIWebView在應用程序中顯示PDF(在iPad上)時存在很多問題。我已經查看了所有我能找到的東西,但我似乎無法找到任何滿意的結果。使用UIWebView無法顯示PDF

我試圖做的是很基本的,所以我真的不知道爲什麼它不工作。我需要做的就是在UIWebView中顯示本地存儲的PDF。從本質上講,我所得到的只是一個黑屏。如果有人可以看看我的代碼,我真的很感激它。謝謝。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    // Segue to the materials screen. 

    if ([segue.identifier isEqualToString:@"materials"]) { 
     PDFViewController *pdfViewController = [segue destinationViewController]; 

     NSIndexPath *path = [self.tableView indexPathForSelectedRow]; 
     int row = [path row]; 
     Lesson *selected = [purchasedLessons objectAtIndex:row]; 
     pdfViewController.selectedLesson = selected ; 

    //Start Load PDF in UIWebView 

     pdfViewController.pdfWindowTitle.title = selected.titleAndSubtitle; 

     pdfViewController.pdfWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 1024, 704)]; 

     NSString *urlAddress = [[NSBundle mainBundle] pathForResource:@"moonlightSonataFirstMovement" ofType:@"pdf"]; 
     NSURL *url = [NSURL fileURLWithPath:urlAddress]; 

     NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 

     [pdfViewController.pdfWebView loadRequest:requestObj]; 

    //End Load PDF 

    } 
} 

我檢查,看看我的對象帶來傳遞到現場正確(這是),如果我得到一個適當的請求的;我越來越:

<NSURLRequest file://localhost/Users/MYCOMPUTER/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/AB161E57-D942-44C2-AA75-030087820BED/iLessons%20Piano.app/moonlightSonataFirstMovement.pdf>

另外,我有這樣的錯誤消息:

iLessons Piano[23080:f803] DiskImageCache: Could not resolve the absolute path of the old directory. 

此外,該消息的NSLog會打印出8倍出於某種原因。

我能想到的唯一的事情是我需要的時候我在打電話前一個場景我prepareForSegue功能做到這一點加載。這或使用像Quartz一樣的不同方法。但我寧願使用UIWebView,因爲我真正需要做的是顯示並允許滾動。

+0

只是想一想,名字是否正確?設備路徑始終區分大小寫。 – cocoakomali 2012-03-07 19:20:51

+0

是的,我希望它只是文件名。我檢查了幾次。它匹配:(這是「moonlightSonataFirstMovement.pdf」 – Barks 2012-03-07 19:25:51

+0

我試着將代碼移入prepareForSegue函數,但仍然沒有任何內容只是一個黑屏 – Barks 2012-03-07 20:07:20

回答

1

IM不知道怎麼回事..你查看和web視圖都保持零值..因爲我告訴你,我很沒有參與故事板還..但是你作爲一個變通的解決方案也許這解決您的問題

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1027, 768)]; 
    pdfViewController.view = view; 
    pdfViewController.pdfWebView = [[UIWebView alloc] initWithFrame:pdfViewController.view.frame]; 

    NSString *urlAddress = [[NSBundle mainBundle] pathForResource:@"moonlightSonataFirstMovement" ofType:@"pdf"]; 
    NSURL *url = [NSURL fileURLWithPath:urlAddress]; 

    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 

    [pdfViewController.view addSubview:pdfViewController.pdfWebView]; 
    [pdfViewController.pdfWebView loadRequest:requestObj]; 
+0

這就像一個魅力!我只是把它放到prepareForSegue函數和瞧,它一定是我沒有創建渲染的框架或什麼東西,我必須撕裂它有點分辨出來,但沒有,它的工作克,這真是太棒了:) – Barks 2012-03-08 01:31:30

+0

哈哈...也許我說得太快了。我更改了selected.materialsFilename的@「moonlightSonataFirstMovement」字符串,希望能夠加載選中的pdf,但似乎選擇了正確的教程(其materialsFilename屬性爲@「」),我仍然得到moonlightSonataFirstMovement PDF正在加載...所以很困惑... – Barks 2012-03-08 01:44:40

+0

抱歉,但我沒有得到你的觀點..所以現在你試圖加載另一個pdf,但你總是有moonlightSonataFirstMovement加載? – 2012-03-08 01:55:23

0

作爲一種變通方法,您可以禁用或刪除您的「所有例外」斷點。這可能會使調試變得更加困難,但並不像必須始終重新啓動應用程序那樣糟糕。

enter image description here

這是造成問題的斷點。我已經把它不久前,我已經忘記了它的存在

+0

它在我的情況下工作的魅力。 – user1489709 2013-02-20 20:13:42

3

DiskImageCache:無法解析的老 目錄的絕對路徑。

這個人是不是真正的原因的應用程序崩潰。此警告可以通過分配故事板中的視圖來解決。它似乎已經連接,但它是灰色的。因此,再次分配,它會很好。

對我來說,真正的問題是,PDF圖像是300 DPI,它的時間太長加載應用程序。由於調試器使應用程序不會崩潰,它似乎可以正常工作,但是如果沒有調試器,加載時間會過長,並且會導致超時崩潰。

有幾件事你可以做。您可以縮減您的PDF,這可能是一件好事,因爲舊設備的速度更慢,支持這些設備也不錯。但是真正解決它的是通過延遲PageView初始化。以下是我所做的:

在RootViewController中,我將代碼從viewDidLoad移至新函數setupPageViewer

,並把這個在viewDidLoad

[自performSelector:@selector(setupPageViewer)withObject:無afterDelay:0.0F];

延遲0.0意味着它將在下一幀中被照顧,讓您有機會顯示加載指標。

享受!