2
votes

So, I realize that there have been many questions regarding using a UIWebView to display a PDF in an app (on the iPad). I have reviewed everything I can find but I can't seem to find any satisfaction.

What I'm trying to do is very basic so I really don't know why it's not working. All I need to do is display a locally stored PDF in the UIWebView. Essentially, all I'm getting is a black screen. If someone could take a look at my code, I'd really appreciate it. Thanks.

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

    }
}

I've checked to see if my object is bring passed into the scene properly (and it is) and if I am getting a proper request out; i'm getting:

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

Also, I've have this error message:

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

Additionally, the NSLog message gets printed out 8 times for some reason.

The only thing I can think of is that I need to do this loading when I call my prepareForSegue function in the previous scene. That or use a different method like Quartz. But I'd rather use a UIWebView since all I really need to do is display and allow scrolling.

3
Just a quick thought, is the name correct? Device path is always case sensitive.cocoakomali
Yea, I wish it was just the filename. I've checked it a few times. It matches :( It's "moonlightSonataFirstMovement.pdf".Barks
I tried moving the code into the prepareForSegue function but still nothing. Just a black screen.Barks
I uploaded a zip of my project if anyone wants to take a look at the whole thing to see if they can figure out what's going on. Thanks. mediafire.com/?6z6q3muw4taufyiBarks
@Barks actually i didn't involved in the storyBoard and these wired stuff :) but your pdfWebView value is set to nil when you are try to load the request .. find the reason of that.Malek_Jundi

3 Answers

3
votes

DiskImageCache: Could not resolve the absolute path of the old directory.

This one isn't the real reason the app crashes. This warning can be fixed by assigning the view in the Storyboard. It seems like it's connected already but it's grey. So assign it again and it will be fine.

The real issue for me was that the PDF images were 300 DPI and it took too long to load the application. Since the debugger keeps the app from crashing it seems to work fine but the loading will take too long without the debugger and will result in a timeout crash.

There's a few things you can do. You can downscale your PDF which might be a good thing anyway since older device are even slower and it's nice to support those as well. But what really fixes it is by delaying the PageView initialization. Here's what I did:

In the RootViewController I moved the code from the viewDidLoad to a new function setupPageViewer.

And put this in the viewDidLoad:

[self performSelector:@selector(setupPageViewer) withObject:nil afterDelay:0.0f];

The delay 0.0 means it will be taken care of in the next frame which gives you the opportunity to show a loading indicator.

Enjoy!

1
votes

im not sure about whats going on .. you view and webView both holding nil value.. as i told you im not involved in the storyBoard yet .. but you as a workaround solution maybe this fix your problem

    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
votes

As a workaround, you can disable or remove your 'All Exceptions' breakpoint. This might make debugging a little more difficult, but it's not as bad as having to relaunch the application all the time.

enter image description here

This is the breakpoint causing the issue. I had set it so long ago that I'd forgotten it was there