多个UIWebViewNavigationTypeBackForward不仅是假的,而且推断实际的url是不可能的

时间:2010-05-17 19:24:26

标签: iphone uiwebview

我有一个UIWebView和一个UITextField用于url。当然,我希望textField始终显示当前文档的URL。这适用于直接在字段中输入的网址,但我也有一些按钮附加到视图重新加载,后退和前进。

所以我已经将所有UIWebViewDelegate方法添加到我的控制器中,因此只要webView导航并根据需要更改textField中的url,它就可以收听。

以下是我使用shouldStartLoadWithRequest:方法的方法:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
 NSLog(@"navigated via %d", navigationType);
 //loads the user cares about
 if ( navigationType == UIWebViewNavigationTypeLinkClicked 
  || navigationType == UIWebViewNavigationTypeBackForward ) {
  //URL setting
  [self setUrlQuietly:request.URL];

 }

    return YES;
}

现在,我的问题是,实际点击将生成“LinkClicked”类型的单个导航,然后是十几种类型“其他”(我假设的重定向和广告加载),这些代码可以正确处理,但是后退/前进动作将作为后退/前转请求生成其所有请求。

换句话说,点击调用setUrlQuietly:一次,但后退/前进多次调用它。

我正在尝试使用此方法来确定用户是否实际启动了操作(我也想抓住页面重定向)。但是,如果该方法无法区分实际的“后退”和“由后退引发的负载”,我该如何进行此评估?

如果没有这个,我完全不知道如何只显示实际网址而不是中间网址。谢谢!

2 个答案:

答案 0 :(得分:0)

好的,这就是我最终做的事情 - 不确定这是否是预期的解决方案。从上面的方法中抓取所有代码,然后执行此操作:

- (void)webViewDidStartLoad:(UIWebView *)webView {
    NSString *urlString = [self.webView stringByEvaluatingJavaScriptFromString:@"document.URL"]
    [self setUrlQuietly:[NSURL URLWithString:urlString]];
}

这意味着点击链接等和看到文本显示在textField之间有一点点延迟,但它也保证textField始终显示文档的实际标题。

答案 1 :(得分:0)

我根本没有看到UIWebViewNavigationTypeBackForward事件。有时webViewDidStartLoad永远不会被调用。也许iOS 5中有一些变化。

无论如何,这是我保持标题和URL最新的解决方案。虽然响应速度可能会快一些,但效果非常一致。

- (void)webViewDidFinishLoad:(UIWebView *)wv
{
    [self updateButtons];
    titleLabel.text = [wv stringByEvaluatingJavaScriptFromString:@"document.title"];

    NSURL *url = wv.request.URL;
    [selectedUrl release];
    selectedUrl = [url retain];
}