【问题标题】:UIWebView with contentEditable (html editing), first responder handling?UIWebView 与 contentEditable(html 编辑),第一响应者处理?
【发布时间】:2012-01-18 10:49:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: html uiwebview contenteditable html-editor first-responder


    【解决方案1】:

    下面是我如何在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

    【讨论】:

      【解决方案2】:

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

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

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

      希望这会有所帮助。 :)

      【讨论】:

      • 非常感谢!但是,我还需要将“becomeFirstResponder”和“isFirstResponder”等效方法用于其他目的
      • 我在工作中遇到了其他问题,无法完全测试,但现在我做到了,但它似乎无法正常工作,iPhone 或 iPad ......你还有其他事情吗会影响键盘吗??
      【解决方案3】:

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

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

      但焦点转到第一点而不是最后一点

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-02-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多