web-dev-qa-db-fra.com

Appel de Javascript à l'aide d'UIWebView

J'essaie d'appeler un javascript dans une page html en utilisant la fonction -

View did load function
{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"BasicGraph.html"];
    NSURL *urlStr = [NSURL fileURLWithPath:writablePath];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *myPathInfo = [[NSBundle mainBundle] pathForResource:@"BasicGraph" ofType:@"html"];
    [fileManager copyItemAtPath:myPathInfo toPath:writablePath error:NULL];

    [graphView loadRequest:[NSURLRequest requestWithURL:urlStr]];
}

- (void) webViewDidFinishLoad:(UIWebView *)webView
{
    [graphView stringByEvaluatingJavaScriptFromString:@"methodName()"];
}

Voici le javascript sur la page html -

<script>
    function methodName()
      {
         // code to draw graph
      }

Cependant, la fonction methodName() n'est pas appelée mais après window.onload = function () tout fonctionne bien.

J'essaie d'intégrer RGraphs dans mon application et Basic.html Est la page html dans laquelle les javascripts sont écrits.

Ce serait formidable si quelqu'un pouvait m'aider avec ça.

36
learner2010

Simple: vous essayez d'exécuter la fonction JS à partir d'Objective-C avant même le chargement de la page.

Implémentez la méthode déléguée de UIWebViewwebViewDidFinishLoad: Dans votre UIViewController et là vous appelez [graphView stringByEvaluatingJavaScriptFromString:@"methodName()"]; pour vous assurer que la fonction est appelée après la page a été chargée.

68
Björn Kaiser

Pour clarifier un peu plus.

.h - implémenter UIWebViewDelegate

@interface YourViewController : UIViewController <UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@end

.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *path = @"http://www.google.com";
    [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:path]]];
    _webView.delegate = self; //Set the webviews delegate to this
}

- (void) webViewDidFinishLoad:(UIWebView *)webView
{
    //Execute javascript method or pure javascript if needed
    [_webView stringByEvaluatingJavaScriptFromString:@"methodName();"];
}

Vous pouvez également affecter le délégué du storyboard au lieu de le faire dans le code.

10
Kalel Wade