我正在开发一个使用UIWebView的应用程序。我正在实施UIWebView - How to identify the "last" webViewDidFinishLoad message?
中的手动载入计数方法我原则上可以看到启动/结束/失败负载的调用。但是,对于一些网页(最特别是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, NIKHIL
答案 0 :(得分:1)
作为避免此问题的解决方法 - 您可以收听键盘显示/隐藏通知。 然后,当您知道使用键盘时,不要让Web视图执行请求
更新
首先,您需要将视图控制器设置为webview委托,以便它可以响应Web视图委托消息:
@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