IOS - 当uiwebview重新加载时如何避免键盘隐藏

时间:2012-11-16 03:23:51

标签: iphone ios webview keyboard hide

我有一个加载网络聊天客户端的webview。

每次聊天时,页面都有一个文本字段来输入文字。

问题在于,当用户打开键盘时,由于几个重新加载页面的ajax请求,它会在短时间后自动隐藏。这对用户来说真的很烦人,因为他或她在键盘隐藏之前无法输入完整的句子。

我不知道为什么,这只发生在iPhone 4S和iPhone 5上。在iPhone 4,3GS和模拟器中一切正常。

我尝试使用 shouldStartLoadWithRequest 来捕获请求并在用户隐藏键盘后加载它,但这会破坏聊天会话。

我尝试使用相同的方法使用线程休眠“挂起”请求,但它发生在主线程中,因此它会冻结整个应用程序。

有没有办法可以简单地避免键盘隐藏?

3 个答案:

答案 0 :(得分:7)

经过长时间的研究后,我发现了一种方法,它不是最好的,但它对我帮助很大。

首先使用DOM检查webView firstResonder是否

- (BOOL)isWebViewFirstResponder
{
    NSString *str = [self.webView stringByEvaluatingJavaScriptFromString:@"document.activeElement.tagName"];
    if([[str lowercaseString]isEqualToString:@"input"]) {
        return YES;
    }
    return NO;
}

然后回复UIWebViewDelegate方法shouldStartLoadWithRequest,如果NO是第一响应者,则返回UIWebView

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if([self isWebViewFirstResponder] &&
   navigationType != UIWebViewNavigationTypeFormSubmitted) {
        return NO;
    } else {
        return YES;
    }
}

答案 1 :(得分:-1)

您可以在DidLoad方法中使用通知中心,以便在键盘隐藏时进行监听:

[[NSNotificationCenter defaultCenter] addObserver:self
                                     selector:@selector(keyboardWillHide)
                                         name:UIKeyboardWillHideNotification
                                       object:nil];

- (void) keyboardWillHide{

  [webView becomeFirstResponder];
}

这将使Web视图成为第一响应者并再次显示键盘。我自己没有尝试过,所以希望它会成功。

答案 2 :(得分:-1)

如果你的文字字段在UIView上

您可以使用网络视图委派方法

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    [textField becomeFirstResponder];
}
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    [textField becomeFirstResponder];
}

否则如果textField在UIWebView上,则将textField替换为webView,如下所示。

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    [webView becomeFirstResponder];
}
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    [webView becomeFirstResponder];
}