17

我有使用UIWebView. 我注意到对于某些页面,没有UIWebViewDelegate调用任何方法。

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

  1. 将上面的 youtube URL 加载到UIWebView [注意,这里的UIWebViewDelegate方法在页面加载时会被调用]
  2. 触摸页面上的“上传”类别
  3. 触摸该类别中的任何视频 [问题:注意加载了一个新页面,但没有调用任何 UIWebView 代表]

我知道这不是UIWebView' 代理设置不正确的问题,因为在加载其他链接时会调用代理方法(例如,如果您尝试单击将您带到 youtube 之外的链接,您会注意到代理方法被调用)。

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

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

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

并知道为什么会发生这种情况,或者我该如何解决它以在发出新请求时更新 UI?

4

3 回答 3

20

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

当您按照您的描述单击该页面上的视频链接时,请仔细查看桌面 Safari 中发生的情况。确保您注意地址栏。地址会改变,但关键是页面不会重新加载

这一切都由 JavaScript 处理,而不是通过重新加载页面。简单地说,页面永远不会重新加载,因此没有理由调用 UIWebView 委托

如果您不相信我,为了最终证明这一点,请尝试在禁用 JavaScript 的情况下重复您描述的步骤。您会注意到页面的行为完全不同。

于 2011-01-09T22:50:27.487 回答
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;
}
于 2011-01-31T09:42:20.783 回答
-3

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

于 2011-02-21T05:10:14.017 回答