didFailLoadWithError中的webVIew.request.URL:是先前的URL而不是失败的URL

时间:2012-11-08 23:34:48

标签: ios uiwebview

假设有一个网页A.html,其中包含指向B.html的链接。

如果单击了B.html,那么shouldStartLoadWithRequest中的request.URL将是B.html,因为它应该是.html。但是,如果加载该页面时出现问题(例如,假设它不存在),那么在didFailLoadWithError中:webView.request.URL的值不是B.html而是A.html。

因此,除非我缓存最后一页加载,否则似乎无法知道哪个页面加载失败,但我原本希望webView.request.URL为B.html,因此这是一个缺陷吗? 我没有看到它应该是什么的文档。

[iOS 6]

3 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。如果其他人也这样做,则错误地使用error.userInfo字典。

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error

{

    if (error.domain == NSURLErrorDomain) {
        if (error.code == NSURLErrorCancelled) { //ignore this one, interrupted load
            return;
        }
}
}
//NSString *theURLString = [webView.request.URL absoluteString]; this won't work - it just returns the last successful url
NSString *theURLString = [error.userInfo objectForKey:@"NSErrorFailingURLStringKey"]; //this works

doco说在iOS4中不推荐使用NSErrorFailingURLStringKey(仅提供向后兼容性),您应该使用NSURLErrorFailingURLStringErrorKey。

但是不返回NSURLErrorFailingURLStringErrorKey(不管我的UIWebView版本是什么)。相反,NSErrorFailingURLKey是返回URL的另一个键,但我无法在任何地方的文档中找到它。

答案 1 :(得分:1)

我遇到了与Swift 3.1相同的问题。要获取失败的URL,请使用此委托方法:

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool{

    let failedUrl = (request.url?.absoluteString)! as String
    return true
}

答案 2 :(得分:0)

你是正确的,你需要缓存最后发送的请求(shouldStartLoadWithRequest:委托方法将是一个很好的地方),作为request的{​​{1}}属性}似乎总是返回最后一个成功的请求(尽管documentation没有具体指定这个,所以我不会称之为缺陷)。