7

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

与每次聊天一样,该页面都有一个用于输入文本的文本字段。

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

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

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

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

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

4

3 回答 3

7

因此,经过长时间的研究,我找到了一种方法,虽然它不是最好的,但它对我帮助很大。

首先使用DOM检查webView是否为firstResonder

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

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

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if([self isWebViewFirstResponder] &&
   navigationType != UIWebViewNavigationTypeFormSubmitted) {
        return NO;
    } else {
        return YES;
    }
}
于 2014-03-27T15:47:21.267 回答
-1

您可以在 DidLoad 方法中使用通知中心来监听键盘何时隐藏,如下所示:

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

- (void) keyboardWillHide{

  [webView becomeFirstResponder];
}

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

于 2014-01-10T13:03:36.870 回答
-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];
}
于 2014-01-10T13:11:18.480 回答