使用UIWebView显示PDF不起作用

时间:2012-03-07 17:54:22

标签: ios xcode ipad uiwebview

所以,我意识到有很多关于使用UIWebView在应用程序中显示PDF的问题(在iPad上)。我已经回顾了我能找到的所有内容,但我似乎无法满足。

我想要做的是非常基本的,所以我真的不知道为什么它不起作用。我需要做的就是在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,因为我真正需要做的就是显示并允许滚动。

3 个答案:

答案 0 :(得分:3)

  

DiskImageCache:无法解析旧的绝对路径   。目录

这个不是应用程序崩溃的真正原因。可以通过在Storyboard中分配视图来修复此警告。它似乎已经连接但它是灰色的。所以再次分配它就没问题了。

对我来说真正的问题是PDF图像是300 DPI,加载应用程序花了太长时间。由于调试器使应用程序不会崩溃,因此似乎工作正常,但是如果没有调试器,加载将花费太长时间,并且会导致超时崩溃。

你可以做一些事情。你可以降低你的PDF,这可能是一件好事,因为旧的设备甚至更慢,并且支持这些也很好。但真正解决它的是延迟PageView初始化。这是我做的:

在RootViewController中,我将代码从viewDidLoad移到了新函数setupPageViewer

并将其放入viewDidLoad

  

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

延迟0.0意味着它将在下一帧中处理,这使您有机会显示加载指示器。

享受!

答案 1 :(得分:1)

我不确定最新情况...你查看和webView都持有nil值..因为我告诉你我还没有参与故事板......但你作为一种解决方案解决方案也许这可以解决你的问题

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

答案 2 :(得分:0)

作为解决方法,您可以禁用或删除“所有异常”断点。这可能会使调试变得更加困难,但它并不像必须一直重新启动应用程序那么糟糕。

enter image description here

这是导致问题的断点。我很久以前就把它设置好了,我忘了它就在那里