UIWebView mit contentEditable (HTML-Bearbeitung), First-Responder-Handling?

Lesezeit: 2 Minuten

Ich mache eine HTML-Editor-Komponente für eine App (unter Verwendung von UIWebView mit contentEditable in iOS 5.0) und bin beim Umgang mit dem UIWebView-Ersthelferstatus hängengeblieben

[webView isFirstResponder], [webView becomeFirstResponder] und [webView resignFirstResponder] scheinen nicht zu funktionieren, und ich habe keine Ahnung, wie man das WebView per Code werden oder zurücktreten lässt

Wenn jemand weiß, wie das geht, wäre ich sehr dankbar, danke im Voraus!

UIWebView mit contentEditable HTML Bearbeitung First Responder Handling
alex-i

So überschreibe ich diese Methoden in a UIWebView Unterklasse (content ist die ID des bearbeitbaren Elements):

-(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 gibt nur true zurück, nachdem die Tastatur angezeigt wird (z. B. gibt es false bei UIKeyboardWillShowNotification zurück)

Falls dies ein Problem ist, eine andere Möglichkeit, um zu überprüfen, ob die UIWebView ist der Ersthelfer ist wie folgt:

+(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];
}

Auf diese Weise wird der zurückgegebene Wert sein YES sogar bevor/nachdem die Tastaturanimation endet (ein- oder ausblenden).

Ich bin kürzlich auf dasselbe Problem gestoßen, habe es aber mit reinem JavaScript gelöst. Eigentlich benötigt es keine Objective-C First Responder-bezogenen Methoden. Ich habe gerade das JavaScript verwendet, um den Inhalt der UIWebView zu ändern – den contentEditable-Attributwert des HTML-Zielelements entsprechend der Anforderung.

Verwenden Sie beispielsweise den folgenden Code, um die Tastatur auszublenden, die vom bearbeitbaren Inhalt der UIWebView aufgerufen wird:

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

Hoffe, das ist hilfreich. 🙂

  • Danke vielmals! Ich muss jedoch auch die äquivalenten Methoden “becomeFirstResponder” und “isFirstResponder” für andere Zwecke verwenden

    – Ismael

    14. Dezember 11 um 13:11 Uhr

  • Ich bin bei meiner Arbeit mit anderen Dingen hängen geblieben und konnte das nicht vollständig testen, aber jetzt habe ich es getan, und es scheint nicht zu funktionieren, iPhone oder iPad … tun Sie sonst noch etwas, das die Tastatur beeinträchtigen könnte??

    – Ismael

    27. Dezember 2011 um 17:14 Uhr


So überschreibe ich diese Methoden in einer UIWebView-Unterklasse (Inhalt ist die ID des bearbeitbaren Elements):

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

Aber Focus geht zum 1. Punkt, nicht zum letzten Punkt

Rufen Sie die folgenden Codezeilen auf, wenn Sie die Tastatur ausblenden möchten.

//wView is your UIWebView

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

[webView loadHTMLString:[NSString stringWithFormat:@”%@”, htmlString] baseURL:nil]; Dies funktioniert in iOS > 4

.

620920cookie-checkUIWebView mit contentEditable (HTML-Bearbeitung), First-Responder-Handling?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy