使用 UIWebView 显示 PDF 不工作

Posted

技术标签:

【中文标题】使用 UIWebView 显示 PDF 不工作【英文标题】:Displaying a PDF with UIWebView Not Working 【发布时间】:2012-03-07 17:54:22 【问题描述】:

所以,我意识到有很多关于使用 UIWebView 在应用程序(在 iPad 上)中显示 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,因为我真正需要做的就是显示并允许滚动。

【问题讨论】:

想一想,这个名字对吗?设备路径始终区分大小写。 是的,我希望它只是文件名。我已经检查了几次。它匹配:(它是“moonlightSonataFirstMovement.pdf”。 我尝试将代码移动到 prepareForSegue 函数中,但仍然没有。只是黑屏。 我上传了我的项目的一个 zip 文件,如果有人想看看整个事情,看看他们是否能弄清楚发生了什么。谢谢。 mediafire.com/?6z6q3muw4taufyi @Barks 实际上我没有参与故事板和这些有线的东西:) 但是当你尝试加载请求时你的 pdfWebView 值设置为 nil .. 找到原因。 【参考方案1】:

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

这不是应用崩溃的真正原因。可以通过在 Storyboard 中分配视图来修复此警告。它似乎已经连接,但它是灰色的。所以重新赋值就可以了。

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

您可以做一些事情。您可以缩小 PDF 的比例,这可能是一件好事,因为旧设备的速度甚至更慢,而且支持这些设备也很好。但真正解决它的是延迟 PageView 初始化。这是我所做的:

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

并把它放在viewDidLoad:

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

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

享受吧!

【讨论】:

【参考方案2】:

我不确定发生了什么.. 你 view 和 webView 都持有 nil 值.. 正如我告诉你的那样,我还没有参与 storyBoard .. 但是你作为一种解决方法也许可以解决你的问题

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

【讨论】:

这就像一个魅力!我只是将它放入 prepareForSegue 函数中,瞧。一定是我没有为渲染创建框架或其他东西。我必须在某个时候把它拆开才能弄清楚,但不是这样,它正在工作,这太棒了:) 大声笑...也许我说得太早了。我更改了 selected.materialsFilename 的 @"moonlightSonataFirstMovement" 字符串,期望它能够加载选择的任何 pdf,但看起来它正在选择正确的课程(其 materialsFilename 属性是 @"")我仍然得到正在加载 moonlightSonataFirstMovement PDF...好困惑... 对不起,我没明白你的意思..所以现在你尝试加载另一个 pdf,但你总是加载 moonlightSonataFirstMovement? 是的,我希望应用程序做的是加载与所选课程对象相关的任何 PDF。因此,每个课程对象(对应于每个表格单元格)都将具有一个“materialsFilename”属性,该属性只是一个包含文件名的字符串。目前,我将第 2 课和第 3 课的设置为空白,而我将第 1 课的设置为 @"moonlightSonataFirstMovement"。当用户从 tableView 中选择一堂课然后点击“材料”按钮时,他们应该被带到 PDF 查看器屏幕并且应该显示正确的 PDF。 aha 我明白了.. 你得到的是相同的 pdf,因为(int 行)总是返回 0,那是因为 indexPath 是 nil,那是因为你没有连接你的 tableView IBOutlet :)跨度> 【参考方案3】:

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

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

【讨论】:

以上是关于使用 UIWebView 显示 PDF 不工作的主要内容,如果未能解决你的问题,请参考以下文章

UIWebview 缩放 PDF 和大 .图像缩放默认 IOS

在 UIWebView 中显示“.doc”和“.docx”

黑色图块在UIWebview中以pdf缩放显示

uiwebview中pdf的页码

PDF 未在 UIWebView 中正确显示

在显示pdf时,是否可以在UIwebview中删除[“Page 1 of 20”视图]?