2013-01-15 27 views
19

私は目的関数Cの新しいプログラマーです。Objective Cにいくつかのhtmlファイルを追加しました。このhtmlファイルには、単純なJavaScript関数が含まれています。私は客観的なCコードを介してその関数を呼び出す必要があります。私はgoogleを使って多くの時間をかけました。しかし、私はそれをする本当の方法を見つけることができませんでした。 ベローは、HTMLファイルが含ま:目的関数CでJavaScript関数を呼び出す方法

<!DOCTYPE html> 
<html> 
    <head> 
     <script> 
      function myFunction() 
      { 
       alert("Hello World!"); 
      } 
      </script> 
    </head> 

    <body> 
     <button onclick="myFunction()">Try it</button> 
    </body> 
</html> 

を、私はこのように、この関数を呼び出した:それが正しいか間違っています?それが間違っている場合、これを行う方法。助けてください。

NSString *path; 
NSBundle *thisBundle = [NSBundle mainBundle]; 
path = [thisBundle pathForResource:@"first" ofType:@"html"]; 
NSURL *instructionsURL = [NSURL fileURLWithPath:path]; 
[webView loadRequest:[NSURLRequest requestWithURL:instructionsURL]]; 

NSString * jsCallBack = [NSString stringWithFormat:@"myFunction()"]; 
[webView stringByEvaluatingJavaScriptFromString:jsCallBack]; 

[webView stringByEvaluatingJavaScriptFromString:@"myFunction()"]; 
+1

アラートは表示されるかどうかを確認しますか? – BabyPanda

+0

ボタンをクリックすると、そのボタンが表示されます。しかし、私はその関数をプログラムで呼びたいと思います。 – Himesh

+0

あなたは何を達成しようとしていますか?あなたのアプリケーションはHTML5タイプですか?なぜネイティブUIKitを使用しないのですか? – pbibergal

答えて

25
NSString *path; 
NSBundle *thisBundle = [NSBundle mainBundle]; 
path = [thisBundle pathForResource:@"first" ofType:@"html"]; 
NSURL *instructionsURL = [NSURL fileURLWithPath:path]; 
[webView loadRequest:[NSURLRequest requestWithURL:instructionsURL]]; 

NSString * jsCallBack = [NSString stringWithFormat:@"myFunction()"]; 
[webView stringByEvaluatingJavaScriptFromString:jsCallBack]; 

[webView stringByEvaluatingJavaScriptFromString:@"myFunction()"]; 

それは動作しませんよりも、単一の場所から呼び出されるすべてこのコードは、もし、ページのロードが非同期であり、JavaScriptコードを持つページがその時点で準備ができていませんので。 フォルダを投影するhtmlファイルを追加UIWebViewDelegateコールバックメソッドで[webView stringByEvaluatingJavaScriptFromString:@"myFunction()"];–webViewDidFinishLoad:

+0

本当にあなたの答えに感謝します。それは100%働いています。もう一度ありがとう。 – Himesh

+0

答えは非常に正しいです。私はそれに余分な機能を与えています ありがとうございます! – umakanta

+0

iOS 8 wkwebviewの操作方法をお知らせください。 –

9
<!DOCTYPE html> 
<html> 
<head> 

    <script type="text/javascript" charset="utf-8" src="your.js"></script> 
    <script type="text/javascript" charset="utf-8" src="andYourJsfileName.js"></script> 

    <script> 
     function myFunction('yourParameter') 
     { 
      // do your javascript operation 

      //alert("my Hello World!"); 
      return value; 
     } 

    </script> 
</head> 

<body> 
    <!--button onclick="myFunction()">Try it</button--> 
</body> 

このメソッドを呼び出すようにしてください。 javascriptファイルをプロジェクトフォルダにも追加します。プロジェクトに任意のJavaScriptのファイルを追加し、それをするために含むことができ、ここであなたのdidLoad方法であなたのviewController.m

-(void)loadMyWebView { 
    webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 200)]; 
    NSString *path; 
    NSBundle *thisBundle = [NSBundle mainBundle]; 
    path = [thisBundle pathForResource:@"first" ofType:@"html"]; 
    NSURL *instructionsURL = [NSURL fileURLWithPath:path]; 

    NSString* htmlString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; 

    webView.delegate=self; 

    [webView loadHTMLString:htmlString baseURL:instructionsURL]; 
    // [self.view addSubview:webView]; (if you want to access the javascript function and don't want to add webview, you can skip that also.) 
} 


- (void)webViewDidFinishLoad:(UIWebView*)theWebView { 
    NSString* returnValue =[theWebView stringByEvaluatingJavaScriptFromString:@"myFunction('pass your parameter')"]; 
    NSLog(@"returnValue = %@ ",returnValue); 
} 

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{ 

    NSLog(@" didFailLoadWithError"); 
} 

コールこの[self loadMyWebView];

にhtmlファイルと、このネイティブコードを追加した後

htmlファイルタグ内でjavascript関数を呼び出すことができます。 (正確にjs関数を呼び出すのと同じです。)

javascript関数にパラメータを渡して、目的関数に何かを返すことができます。

は覚えておいてください:::をすべてのファイルをJS追加した後警告を回避するにはコピーバンドルリソース

にそれらを追加することを忘れないでください:::ソースをコンパイルからそれらを削除

+0

ObjectiveCをJavascript :: http://blog.techno-barje.fr/post/2010/10/06/UIWebView-secrets-パート3 - どのように正しく呼び出すか - ObjectiveC-Javascript/ – umakanta

8

JavaScriptCoreフレームワークを使用してObjective-CからJavaScriptコードを実行できます。

https://github.com/evgenyneu/ios-javascriptcore-demo

+0

インポートを含めて、感謝の男を助けました。 – antihero989

+0

@Evengii https://www.bignerdranch.com/blog/javascriptcore-example/に記載されているように、これはAppleからの私たちのアプリの拒絶につながる可能性があります。 – ViruMax

0

はこれを試してみてください:

NSString *jsCallBack = [NSString stringWithFormat:@"setPhoto('%@')",profileImgPath]; 

[webView stringByEvaluatingJavaScriptFromString:jsCallBack]; 
1

FileName.js:バンドルリソースへの

function greet() { 
    hello(“This is Javascript function!”); 
} 

コピーし、このファイルここ

#import <JavaScriptCore/JavaScriptCore.h> 

... 

JSContext *context = [[JSContext alloc] init]; 
[context evaluateScript: @"function greet(name){ return 'Hello, ' + name; }"]; 
JSValue *function = context[@"greet"]; 
JSValue* result = [function callWithArguments:@[@"World"]]; 
[result toString]; // -> Hello, World 

はデモです。

は今#import <JavaScriptCore/JavaScriptCore.h>

@property (nonatomic,strong) JSContext *context; // Declare this in header file 

     // This code block goes into main file 
     NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"FileName" ofType:@"js"]; 
     NSString *scriptString = [NSString stringWithContentsOfFile:scriptPath encoding:NSUTF8StringEncoding error:nil]; 

     self.context = [[JSContext alloc] init]; 
     [self.context evaluateScript:scriptString]; 

     self.context[@"hello"] = ^(NSString text) { 
      NSLog(@"JS : %@",text); 
     } 

     JSValue *function = self.context[@"greet"]; 
     [function callWithArguments:@[]]; 

ヘッダファイルにこのコードブロックは私のために働きました。 「This is Javascript function!」と表示されます。コンソールで。 これがうまくいきますように!

関連する問題