问题 UIWebView与contentEditable(html编辑),第一响应者处理?


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

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

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


6270
2017-12-12 12:34


起源



答案:


这是我如何覆盖这些方法 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
    [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 甚至在键盘动画结束之前/之后(显示或隐藏)。


13
2018-02-01 12:40





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

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

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

希望这有用。 :)


2
2017-12-13 20:23



非常感谢!但是,我还需要使用“becomeFirstResponder”和“isFirstResponder”等效方法用于其他目的 - Ismael
我在工作中遇到了其他问题并且无法完全测试这个,但现在我做了,它似乎不起作用,iPhone或iPad ......你还做其他可能影响键盘的事吗? - Ismael


答案:


这是我如何覆盖这些方法 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
    [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 甚至在键盘动画结束之前/之后(显示或隐藏)。


13
2018-02-01 12:40





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

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

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

希望这有用。 :)


2
2017-12-13 20:23



非常感谢!但是,我还需要使用“becomeFirstResponder”和“isFirstResponder”等效方法用于其他目的 - Ismael
我在工作中遇到了其他问题并且无法完全测试这个,但现在我做了,它似乎不起作用,iPhone或iPad ......你还做其他可能影响键盘的事吗? - Ismael


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

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

但焦点是第1点而不是最后一点


0
2018-01-29 05:47





如果要隐藏键盘,请调用以下代码行。

//wView is your UIWebView

NSString *webText = [wView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
 [wView loadHTMLString:webText baseURL:nil];

-2
2018-06-13 04:31





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


-2
2018-06-18 12:35



没有替代htmlString的代码 - Remover