我有一个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:一次,但后退/前进多次调用它。
我正在尝试使用此方法来确定用户是否实际启动了操作(我也想抓住页面重定向)。但是,如果该方法无法区分实际的“后退”和“由后退引发的负载”,我该如何进行此评估?
如果没有这个,我完全不知道如何只显示实际网址而不是中间网址。谢谢!
答案 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];
}