UIWebView:加载某些URL时未调用的webViewDidStartLoad / webViewDidFinishLoad委托方法

时间:2010-12-03 08:20:54

标签: iphone uiwebview uiwebviewdelegate

我使用UIWebView实现了基本的网络浏览器。我注意到,对于某些页面,没有调用UIWebViewDelegate方法。

发生这种情况的示例页面是:http://www.youtube.com/user/google。以下是重现问题的步骤(确保在控制器的NSLog方法中插入UIWebViewDelegate次调用):

  1. 将以上youtube网址加载到UIWebView [请注意,此处,UIWebViewDelegate方法会在页面加载时调用]
  2. 触摸页面上的“上传”类别
  3. 触摸该类别中的任何视频 [问题:注意到加载了新页面,但没有调用任何UIWebView委托]
  4. 我知道这不是UIWebView委托未正确设置的问题,因为委托方法在加载其他链接时会被调用(例如,如果您尝试点击链接将您带到外面youtube,你会注意到被调用的委托方法。

    我最初的直觉是它可能是因为页面是使用AJAX加载的,这可能不会调用委托方法。但是当我检查iPhone的Safari时,它没有出现这个问题,所以它一定是我身边的东西。

    我也注意到Three20的TTWebController与我的问题完全相同。

    但是这个问题引起的问题是,如果没有调用委托方法,我将无法更新UI以在加载新请求时启用/禁用后退和前进浏览按钮。

    了解为什么会发生这种情况或者如何在新请求发布时更新UI?

3 个答案:

答案 0 :(得分:20)

这不是iOS错误 - 页面实际上并没有重新加载。在新页面请求之后触发UIWebView委托,但该页面不会这样做。

如果您按照自己的描述单击该页面上的视频链接,请非常仔细地看看桌面Safari中发生的情况。请务必注意地址栏。地址将会改变,但严重的是页面不会重新加载

这全部由JavaScript处理,而不是通过重新加载页面。简单地说,页面永远不会重新加载,因此没有理由将UIWebView委托称为

如果您不相信我,请最终证明此尝试重复您禁用JavaScript时所描述的步骤。您会注意到页面的行为完全不同。

答案 1 :(得分:1)

这不是一个好的解决方案,但我使用NSTimer来更新按钮的状态:

- (BOOL)webView:(UIWebView *)_webview shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (!_timer && [request.URL.absoluteString rangeOfString:@"youtube.com"].length != 0) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:0.5
                                                  target:self
                                                selector:@selector(checkNavigationStatus)
                                                userInfo:nil
                                                 repeats:YES];
    }

    return YES;
}

//....
//....
//....

- (void)checkNavigationStatus
{
    // Check if we can go forward or back
    backButton.enabled = self.webView.canGoBack;
    forwardButton.enabled = self.webView.canGoForward;
}

答案 2 :(得分:-3)

看起来这在iOS 4.2中得到修复。它适用于iOS 4.2。