当 UIWebView 打开 PDF 时 webViewDidFinishLoad 未触发

Posted

技术标签:

【中文标题】当 UIWebView 打开 PDF 时 webViewDidFinishLoad 未触发【英文标题】:webViewDidFinishLoad not firing when UIWebView opens a PDF 【发布时间】:2011-04-05 15:37:27 【问题描述】:

这是我的代码:

- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request  navigationType:(UIWebViewNavigationType)navigationType;  
/* Add Content Loading Banner */
if (navigationType == UIWebViewNavigationTypeLinkClicked) 
    [self.view addSubview:linkLoadView];
    linkLoadView.alpha = 1.0;


/* Handle PDF Opening */
NSURL *url = [request URL];
NSString *urlString = [url absoluteString];
if([urlString rangeOfString:@".pdf"].location == NSNotFound)
    return true;
 else 
    NSURL *filePath = [NSURL URLWithString:urlString];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:filePath];
    [pdfViewer loadRequest:requestObj];
    [self.view addSubview:topView];
    [self.view addSubview:linkLoadView];    
    return false;
   

基本上,它的作用是从我的 UIWebView webView 中检测 PDF 链接并将其加载到另一个 UIWebView pdfViewer(在名为 topView 的视图上找到)。然后我有一个功能如下:

- (void) webViewDidFinishLoad:(UIWebView *)theWebView
        //for webView
        [UIView animateWithDuration:2
                 animations:^
                      loadingView.alpha = 0.0;
                      linkLoadView.alpha = 0.0;
                 
                 completion:^(BOOL finished)
                     [loadingView removeFromSuperview];
                     [linkLoadView removeFromSuperview];
                 ];


对于 pdfViewer 网络视图,上述函数根本不会触发,但对于 webView 网络视图会触发。我该如何解决这个问题?

这是我在 viewDidLoad 方法上对两个 webView 的设置。

//Options for 
webView.delegate = self;
webView.scalesPageToFit = YES;
for (id subview in webView.subviews)
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])
        ((UIScrollView *)subview).bounces = NO;

//Options for 
pdfViewer.delegate = self;
pdfViewer.scalesPageToFit = YES;
for (id subview in pdfViewer.subviews)
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])
        ((UIScrollView *)subview).bounces = NO;

【问题讨论】:

pdfViewer 代理设置是否正确? @Joe 你是对的,但是,现在 PDF 根本无法加载。我的两个网页浏览量都是setDelegate:self,这是问题的一部分吗? 更新了我的代码,做了一些小的改动。 pdfViewer 仍然没有触发 这很奇怪。尝试将此添加到加载代码if(webview != pdfViewer && [urlString rangeOfString:@".pdf"].location == NSNotFound)else if(webview != pdfViewer)。如果可行,我会发布答案。 认为两个问题无关,我发布了一个附加问题。那里的回答者给了我一个线索,我已经发布了一个与您在那里的建议非常相似的解决方案。如果你放弃上面的答案,就声誉而言是双赢的,但在下面,我会接受。 【参考方案1】:

确保 pdfViewer 委托设置正确,您可能需要调整加载代码。

- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request  navigationType:(UIWebViewNavigationType)navigationType;  
    /* Add Content Loading Banner */
    if (navigationType == UIWebViewNavigationTypeLinkClicked) 
        [self.view addSubview:linkLoadView];
        linkLoadView.alpha = 1.0;
    

    /* Handle PDF Opening */
    NSURL *url = [request URL];
    NSString *urlString = [url absoluteString];
    if(webview != pdfViewer)
    
        if([urlString rangeOfString:@".pdf"].location == NSNotFound)
            return true;
         
        else 
            NSURL *filePath = [NSURL URLWithString:urlString];
            NSURLRequest *requestObj = [NSURLRequest requestWithURL:filePath];
            [pdfViewer loadRequest:requestObj];
            [self.view addSubview:topView];
            [self.view addSubview:linkLoadView];    
            return false;
        
    
    return true;

【讨论】:

以上是关于当 UIWebView 打开 PDF 时 webViewDidFinishLoad 未触发的主要内容,如果未能解决你的问题,请参考以下文章

在 UIWebview 中打开 pdf 时出错

PDF uiwebview 加载时未显示活动指示器

对象 - 在UIWebView中打开PDF?

我们可以在iOS上使用UIWebView打开pdf文件吗?

我们可以在iOS上使用UIWebView打开pdf文件吗?

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