11

我正在为一个应用程序制作一个 html 编辑器组件(在 iOS 5.0 中使用 UIWebView 和 contentEditable),并陷入了如何处理 UIWebView 第一响应者状态

[webView isFirstResponder]、[webView becomeFirstResponder] 和 [webView resignFirstResponder] 似乎不起作用,我不知道如何通过代码使 webView 成为或辞职

如果有人知道如何解决这个问题,我将非常感激,在此先感谢!

4

5 回答 5

13

这是我在UIWebView子类中覆盖这些方法的方法(content是可编辑元素的 id):

-(BOOL)resignFirstResponder {
    [self setUserInteractionEnabled:NO];[self setUserInteractionEnabled:YES];
    return [super resignFirstResponder];
}

// only works on iOS 6+
-(void)becomeFirstResponder {
    self.keyboardDisplayRequiresUserAction = NO; // set here or during initialization  
    // important note: in some situations (newer iOS versions), it is also required to first call `blur()` on the 'content' element, otherwise the keyboard won't show up as expected
    [self stringByEvaluatingJavaScriptFromString:@"document.getElementById('content').focus()"];
}

-(BOOL)isFirstResponder{
    if ([[self stringByEvaluatingJavaScriptFromString:@"document.activeElement.id=='content'"] isEqualToString:@"true"]) {
        return YES;
    }
    else {
        return NO;
    }
}

isFirstResponder仅在显示键盘后返回 true(例如,在 UIKeyboardWillShowNotification 将返回 false)

如果这是一个问题,另一种检查是否UIWebView是第一响应者的方法如下:

+(BOOL)isFirstResponder:(UIView *)v{
    for (UIView *vs in v.subviews) {
        if ([vs isFirstResponder] || [self isFirstResponder:vs]) {
            return YES;
        }
    }
    return NO;
}
-(BOOL)isFirstResponder{
    return [[self class] isFirstResponder:self];
}

这样,返回的值YES甚至会在键盘动画完成(显示或隐藏)之前/之后。

于 2013-02-01T12:40:45.693 回答
2

我最近遇到了同样的问题,但使用纯 JavaScript 解决了它。实际上它不需要任何与 Objective-C First Responder 相关的方法。我只是使用 JavaScript 来更改 UIWebView 的内容 - 根据要求定位 HTML 元素的 contentEditable 属性值。

例如,使用以下代码隐藏 UIWebView 的可编辑内容调用的键盘:

[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('target').setAttribute('contentEditable','false')"];

希望这会有所帮助。:)

于 2011-12-13T20:23:46.980 回答
0

Here is how I overwrite these methods in a UIWebView subclass (content is the id of the editable element):

[_webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('content').focus()"];

But Focus go to 1st point not last point

于 2014-01-29T05:47:43.340 回答
-2

当您想要隐藏键盘时,调用以下代码行。

//wView is your UIWebView

NSString *webText = [wView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
 [wView loadHTMLString:webText baseURL:nil];
于 2012-06-13T04:31:28.947 回答
-2

[webView loadHTMLString:[NSString stringWithFormat:@"%@", htmlString] baseURL:nil]; 这适用于 iOS > 4

于 2012-06-18T12:35:02.267 回答