我使用UIWebView
实现了基本的网络浏览器。我注意到,对于某些页面,没有调用UIWebViewDelegate
方法。
发生这种情况的示例页面是:http://www.youtube.com/user/google。以下是重现问题的步骤(确保在控制器的NSLog
方法中插入UIWebViewDelegate
次调用):
UIWebView
[请注意,此处,UIWebViewDelegate
方法会在页面加载时调用] 我知道这不是UIWebView
委托未正确设置的问题,因为委托方法在加载其他链接时会被调用(例如,如果您尝试点击链接将您带到外面youtube,你会注意到被调用的委托方法。
我最初的直觉是它可能是因为页面是使用AJAX加载的,这可能不会调用委托方法。但是当我检查iPhone的Safari时,它没有出现这个问题,所以它一定是我身边的东西。
我也注意到Three20的TTWebController
与我的问题完全相同。
但是这个问题引起的问题是,如果没有调用委托方法,我将无法更新UI以在加载新请求时启用/禁用后退和前进浏览按钮。
了解为什么会发生这种情况或者如何在新请求发布时更新UI?
答案 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。