IOS – 如何避免在uiwebview重新加载时隐藏键盘

我有一个web视图,加载一个networking聊天客户端。

随着每个聊天,页面都有一个文本框来input文本。

问题是,当用户打开键盘时,由于几个正在重新加载页面的Ajax请求,它会在一小段时间后自动隐藏。 这对于用户来说变得非常烦人,因为他或她在键盘隐藏之前不能input完整的句子。

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

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

我试图用一个线程睡眠“挂起”请求在同一个方法,但它发生在主线程,所以它冻结了整个应用程序。

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

所以经过长时间的研究,我发现了一个办法,它不是最好的,但是对我有很大的帮助。

首先使用DOM来检查webView firstResonder

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

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

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

您可以使用DidLoad方法中的通知中心来监听键盘将如何隐藏:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide) name:UIKeyboardWillHideNotification object:nil]; - (void) keyboardWillHide{ [webView becomeFirstResponder]; } 

这将使networking查看第一响应者,并再次显示键盘。 我没有尝试自己,所以希望它会做的伎俩..

如果你的文本字段在UIView上

您可以使用Web视图委托方法

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

否则,如果textField在UIWebView上,那么用webViewreplacetextField,如下所示。

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