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

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

I'm making an html editor component for an app (using UIWebView with contentEditable in iOS 5.0), and got stuck at how to handle UIWebView first responder status

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

[webView isFirstResponder], [webView becomeFirstResponder] and [webView resignFirstResponder] don't seem to work, and i've no idea how to make the webView become or resign it by code

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

If anyone knows how to work this out i would be very grateful, thanks in advance!

推荐答案

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

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

-(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)

isFirstResponder will only return true after the keyboard is shown (e.g, it will return false at UIKeyboardWillShowNotification)

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

In case this is an issue, another way to check if the UIWebView is the first responder is as follows:

+(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.

This way, the returned value will be YES even before/after the keyboard animation finishes (showing or hiding).

相关文章