我正在开发一个使用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

10-08 08:59
查看更多