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!
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:
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):