2013-06-14 7 views
7

Ich habe eine UIWebView in meinen Ansicht-Controller wie folgt eingebettet:Daten zu Passing und aus einem eingebetteten UIWebView

enter image description here

Ich habe einen Auslass auf meine Web-Ansicht() und ich kann den Inhalt erfolgreich geladen von test.html in es mit diesem:

[_graphTotal loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"]isDirectory:NO]]];

versuche ich jetzt Daten an den Web-Ansicht zu übergeben und haben kein Glück gehabt. Ich habe hinzugefügt, die <UIWebViewDelegate> und hier ist, was ich versuche:

NSString *userName = [_graphTotal stringByEvaluatingJavaScriptFromString:@"testFunction()"]; 
NSLog(@"Web response: %@",userName); 

Und hier sind die Inhalte von test.html in meinem Projekt:

<html> 
    <head></head> 
    <body> 
    Testing... 
     <script type="text/javascript"> 
     function testFunction() { 
      alert("made it!"); 
      return "hi!"; 
     } 
     </script> 
    </body> 
</html> 

Ich kann sehen, „Testing ...“ in meinem webView , aber ich sehe weder die Warnung noch das zurückgekehrte "Hallo!" Zeichenfolge.

Irgendeine Idee, was ich falsch mache?

Antwort

14

Nun das Problem ist, dass Sie versucht haben, Ihr Javascript zu bewerten, bevor das Webview die Möglichkeit hatte, die Seite zu laden. Zunächst nehmen die <UIWebViewDelegate> Protokoll in die View-Controller:

@interface ViewController : UIViewController <UIWebViewDelegate> 

dann die Delegierten Ihres Webansicht auf Ihre View-Controller verbinden, die Anfrage machen und schließlich die delegate methods umzusetzen. Hier ist derjenige, der Sie benachrichtigt, wenn die Webansicht geladen wurde:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self.graphTotal loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"]isDirectory:NO]]]; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSString *userName = [self.graphTotal stringByEvaluatingJavaScriptFromString:@"testFunction()"]; 
    NSLog(@"Web response: %@",userName); 
} 

PS: Einer der Grenzen Sie sich bewusst sein müssen, wenn Sie Javascript sind die Bewertung so ist, dass das Skript ausgeführt werden, müssen innerhalb von 10 Sekunden. Wenn Sie zum Beispiel länger als 10 Sekunden gewartet haben, um die Warnung zu verwerfen, erhalten Sie eine Fehlermeldung (konnte nach 10 Sekunden Wartezeit nicht zurückgegeben werden). Finden Sie mehr über die Einschränkungen in the docs.

+0

Brilliant, das hat super funktioniert. Ich hatte den Delegaten hinzugefügt, aber nicht im Interface Builder. Ich benötigte auch die 'webViewDidFinishLoad' Methode. Vielen Dank! –

Verwandte Themen