我正在开发一个使用UIWebView的应用程序。我正在像UIWebView - How to identify the "last" webViewDidFinishLoad message?中那样实现手动负载计数方法
我可以看到对start / finish / failLoad的调用原则上是平衡的。但是,只有几个网页(最特别是google.com),该页面最初加载良好,几秒钟后自动(似乎)自动刷新。开始/结束顺序如下:
-[MyWebView webViewDidStartLoad:], 1, 0x895150c
-[MyWebView webView:didFailLoadWithError:], 0, 0x895150c
-[MyWebView webViewDidStartLoad:], 1, 0x895150c
-[MyWebView webViewDidStartLoad:], 2, 0x895150c
-[MyWebView webViewDidFinishLoad:], 1, 0x895150c
-[MyWebView webViewDidFinishLoad:], 0, 0x895150c
-[MyWebView webViewDidStartLoad:], 1, 0x895150c <-- after a few seconds' gap
-[MyWebView webViewDidFinishLoad:], 0, 0x895150c
第一个参数是被调用的函数,第二个参数是计数器的值,最后一个值是loadCounter的地址,只是为了确认它是相同的webView实例(因此也称为计数器)被调用。我没头绪了:(...
有人有任何线索吗,这里可能会发生什么? (顺便说一句,其他许多网站都不会发生这种情况,到目前为止只有Google才能做到)
编辑:为什么对我来说很重要,因为刷新(显然是随机的)时,它会关闭键盘。如果用户已经在输入内容,这会很烦人。是否可以在后台继续任何刷新,同时继续在前面进行用户交互(尤其是键盘)?
TIA,
尼基尔
最佳答案
作为避免该问题的解决方法-您可以收听键盘显示/隐藏通知。
然后,当您知道使用键盘时,请勿允许Web视图执行请求
更新:
首先,您需要将视图控制器设置为Webview委托,以便它可以响应Web View委托消息:
@interface myViewController : UIViewController <UIWebViewDelegate>
然后,一旦创建了webview对象,请将视图控制器设置为其委托:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
someWebView.delegate = self;
}
现在,当webview执行其请求时,它将首先与myViewController进行协商,因为它是关联的委托。如果您不想让Webview执行请求,这时应该返回NO。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
if (keyboardIsShown == YES){
return NO;
}
else{
return YES;
}
}
您怎么知道此时键盘是否可见?见this post