2014-03-07 4 views
6

Wenn Sie einen UIWebView mit editierbarem Inhalt verwenden, kann der Benutzer seinen eigenen Text auf dem bearbeitbaren DIV eingeben.IOS: Wie erkennen Sie Benutzer, der Text in einem UIWebView innerhalb eines bearbeitbaren editierbaren div ändert

Gibt es eine Möglichkeit, ein Ereignis auf dem ViewController auszulösen, wenn der Benutzer den bearbeitbaren Text ändert (ähnlich wie the UITextField Wertänderungsereignis)?

Der ViewController muss aus zwei Gründen wissen, wann der Benutzer den Text geändert hat. um zu wissen, ob der Benutzer überhaupt einen Text eingegeben hat, und um die Größe des UIWebView zu ändern, wenn der Inhalt wächst.

Der UIWebView Delegat scheint diesen Ereignistyp nicht zu enthalten. Dies muss wahrscheinlich über Javascript geschehen, aber die Antwort scheint nicht da zu sein. Hilfe!

Antwort

7

Es gibt keine direkte Möglichkeit, Ereignisse von UIWebView anzuhören, aber Sie können sie überbrücken. Da iOS7 ist es ziemlich einfach, da es JavaScriptCore.framework ist (Sie müssen es mit Projekt verknüpfen):

JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; 
ctx[@"myUpdateCallback"] = ^(JSValue *msg) { 
    [self fieldUpdated]; 
}; 
[ctx evaluateScript:@"document.getElementById('myEditableDiv').addEventListener('input', myUpdateCallback, false);"]; 

(ich habe keine Möglichkeit zur Zeit den Code zu testen, aber ich hoffe, es funktioniert)

Bevor iOS7 (wenn Sie die niedrigere Version unterstützen möchten, müssen Sie dies verwenden) war es ein bisschen schwieriger. Sie können webView:shouldStartLoadWithRequest:navigationType: für einige benutzerdefinierte Schema, ex auf webView Delegatmethode hören:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
     if ([request.URL.scheme isEqualToString:@"divupdated"]) { 
      [self fieldUpdated]; 
      return NO; 
     } 
     return YES; 
} 

und Feuer so etwas wie dieses auf webView:

[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('myEditableDiv').addEventListener('change', function() {" 
               @"var frame = document.createElement('iframe');" 
               @"frame.src = 'divupdated://something';" 
               @"document.body.appendChild(frame);" 
               @"setTimeout(function() { document.body.removeChild(frame); }, 0);" 
               @"}, false);"]; 
+0

dank lupatus erzielte zunächst so als Antwort markieren. – Lenny

+0

funktioniert nicht für mich .. @Lenny – Devfly

1

Sie müssen einige JS-Hack tun, um diese Funktion zu erhalten .

Zuerst erstellen Sie eine JS-Datei mit einem Skript, das einen Beobachter hinzufügt, der alle editierbaren divs für den Anfang der Bearbeitung beobachtet (ich weiß nicht genau, wie dies in JS gemacht werden sollte, aber eine schnelle Suche bei Google) sollte helfen). Der Rückruf sollte dann aufrufen, um eine speziell gestaltete URL, wie:

textFieldBeginEditing://whateveryoulike 

die JS-Datei in die UIWebView injizieren. Eine mögliche Technik:

- (void)injectJavascript:(NSString *)resource { 
    NSString *jsPath = [[NSBundle mainBundle] pathForResource:resource ofType:@"js"]; 
    NSString *js = [NSString stringWithContentsOfFile:jsPath encoding:NSUTF8StringEncoding error:NULL]; 

    [self.webView stringByEvaluatingJavaScriptFromString:js]; 
} 

nehmen von another so thread.

schließlich in der UIWebViewDelegate method shouldStartLoadingRequest

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    // ... check the url schema 
    NSURL *url = request.URL; 
    if ([url.scheme isEqual:@"textFieldBeginEditing"]){ 
     // here you can handle the event 
     return NO; // important 
    } 
} 
Verwandte Themen