2011-01-14 18 views
13

Ich habe eine UIWebView, die eine HTML-Seite lädt. Diese Seite hat zwei Schaltflächen, sagen Sie Exit und Submit. Ich möchte nicht, dass Benutzer in der Lage sind, auf die Schaltfläche Beenden zu klicken. Sobald die Seite fertig geladen ist (z. B. webViewDidFinishLoad heißt), verwende ich stringByEvaluatingJavaScriptFromString, um eine dieser Schaltflächen zu entfernen, indem ich HTML manipuliere. Ich deaktiviere auch die Benutzerinteraktion unter UIWebView unter webViewDidStartLoad und aktiviere sie erneut unter webViewDidFinishLoad.Ermitteln, wann stringByEvaluatingJavaScriptFromString beendet ist

Das Problem, das ich finde, ist, dass stringByEvaluatingJavaScriptFromString dauert eine Sekunde oder zwei zu vervollständigen, und es scheint in seinem eigenen Thread getan werden. Was also passiert, ist, dass webViewDidFinishLoad aufgerufen wird, Benutzerinteraktion ist auf der UIWebView aktiviert, und wenn der Benutzer schnell ist, können sie auf die Schaltfläche Beenden klicken, bevor stringByEvaluatingJavaScriptFromString beendet ist. Wie stringByEvaluatingJavaScriptFromString scheint auf seinem eigenen Thread mit keine Möglichkeit zu wissen, wenn es fertig ist (es ruft nicht webViewDidFinishLoad), die einzige Möglichkeit, vollständig zu verhindern, dass Benutzer tippen auf die Schaltfläche Beenden, die ich sehe, ist nur Benutzerinteraktion auf dem UIWebView nach aktivieren etwas Verzögerung, die unzuverlässig ist (wie kann ich wirklich wissen, wie lange man warten muss?).

Bin ich richtig, dass stringByEvaluatingJavaScriptFromString ist getan, es ist auf Thread, und ich habe keine Möglichkeit zu sagen, wenn es fertig ist? Irgendwelche anderen Vorschläge, wie man dieses Problem umgehen kann?

EDIT: Kurz gesagt, was ich wissen will, ist, wenn es möglich ist, ein deaktivieren UIWebView während stringByEvaluatingJavaScriptFromString ausgeführt wird, und aktivieren Sie die UIWebView wenn die Javascript fertig ist.

EDIT 2: Es gibt hier einen Artikel, den Sie irgendwie scheint zu implizieren, können die JS-Engine abfragen, um zu sehen, wenn es fertig ist, aber ich kann keine andere Referenzen sagt die gleiche Sache finden: http://drnicwilliams.com/2008/11/10/to-webkit-or-not-to-webkit-within-your-iphone-app/

EDIT 3 Basierend auf der Antwort von Brad Smith, scheint es, dass ich wirklich wissen muss, wenn das UIWebView geladen hat, nachdem das Javascript ausgeführt wurde. Es sieht mehr und mehr so ​​aus, als müsste ich nur eine Art Verzögerung einbringen.

+2

gleiches Problem hier! Was war deine Lösung? –

+0

Ich glaube, ich musste darauf zurückgreifen, nur anzunehmen, dass es eine gewisse Zeit dauern würde, und meine Verarbeitung um mindestens diese Zeitspanne zu verzögern. –

+1

Gleiches Problem. Autsch, es muss einen besseren Weg geben, dies zu tun. –

Antwort

2

Sie könnten das Javascript haben, das Sie in die Seite injizieren, versuchen, die Seite woanders zu navigieren (document.location = "foo"), und verwenden Sie webView: ShoulderLoadRequest: um nach dieser Anfrage zu suchen und sowohl nein als auch trigger zurückzugeben was Sie brauchen (und normalerweise ja zurückgeben).

+0

Hmm, interessant. Klingt wie eine schreckliche Workaround aber es könnte einfach funktionieren ... –

+0

Leider scheint dies für mich nicht zu funktionieren. Ich habe den Aufruf von document.location am Ende des von mir injizierten Javascript angeheftet, aber das scheint immer noch aufgerufen zu werden, bevor der Exit-Button verschwunden ist. Es scheint, dass das JS bereits ausgeführt wurde, aber das WebView die Änderungen nicht fertig bearbeitet hat. –

1

stringByEvaluatingJavascriptFromString muss ausgeführt werden, wenn es zurückgegeben wird. Es kann in einem anderen Thread ausgeführt werden (wahrscheinlich nicht, da es die Benutzeroberfläche ändern kann), aber die Methode kann das Zeichenfolgenergebnis nicht zurückgeben, bis ein Ergebnis zurückgegeben wird.

+0

Ja, mir ist klar, dass das JavaScript erst ausgeführt werden kann, wenn das Webview zurückkehrt. Bitte sehen Sie meine bearbeitete Frage zur Klärung dessen, was ich frage. –

2

Nach stringByEvaluatingJavascriptFromString auszuführen, können Sie Code unten versuchen, Ihr Problem

webView.userInteractionEnabled = NO; 
while (webView.loading) { 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]]; 
} 
webView.userInteractionEnabled = YES; 

Lassen Sie mich zu lösen weiß, seine Arbeit für Sie ist oder nicht.

2

Wie wäre es, eine Stub-Funktion für das onclick-Ereignis direkt auf dem HTML-Element inlining. Sie könnten das html-Element später an eine onclick-Ereignishandlerfunktion binden, wenn es angemessener ist.

<button onclick="function() { };"/> 
Verwandte Themen